【问题标题】:An unusual Python syntax element frequently used in MatplotlibMatplotlib 中经常使用的一个不寻常的 Python 语法元素
【发布时间】:2012-03-16 04:11:56
【问题描述】:

一个附带条件:我的问题的核心语法元素是 Python 语言;然而,这个元素经常出现在 Matplotlib 库中,这是我见过的唯一上下文。所以无论是一般的 Python 语法问题还是特定于库的问题,我都不确定。我所知道的是,我在 Python 语言参考 或 Matplotlib 文档中都找不到任何相关内容。

那些使用和/或使用优秀的 Python 绘图库进行开发的人,Matplotlib 将识别下面的语法模式。 (

from matplotlib import pyplot as MPL

>>> l, = MPL.plot(s, t)      # s & t are ordinary NumPy 1D arrays

这个表达式左边的结构是什么? 而且,

使用它的目的是什么?

我熟悉 Python 的赋值解包,例如,

>>> a, b = [100, 200]

我也知道在 Python 中,单项 元组 有时表示为 t,

两者都可能是上述第一个问题的答案;如果是这样,那么我还不明白为什么这里只需要从调用 plot 返回的值的第一个元素。

(注意:“l”是小写的“ell”;我使用这个字母是因为 ls 是这里最常用的字母,可能是因为它绑定到以相同字母开头的对象——见下文) .


一些额外的上下文:

plot 的调用返回 line2D 实例的列表

>>> type(l)
  <class 'matplotlib.lines.Line2D'>

所以 l 是 line2D 类型的对象。

一旦绑定到 lines2D 对象,这个“变量”通常会在 Matplotlib 代码中看到,如下所示:

>>> l.set_color("orange")

此表达式更改表示绘图窗口内数据值的线条的颜色(“绘图线”)

下面是另一个例子;它显示了这种“变量逗号”构造的常见场景,即在 Matplotlib 绘图窗口中嵌入小型工具包/图形后端独立小部件,例如,通过复选框打开/关闭,多个数据系列出现在绘图窗口中.

在下面的代码中,创建了一个简单的 Matplotlib 图和一个由两个复选框组成的简单小部件,每个复选框一个用于每个数据系列。

l0l1 再次绑定到对 plot 的调用;当他们的 get_visible 和 set_visible 方法在调用 *on_click* 时传入的自定义函数中调用时,两者都会出现几个留置权。

from matplotlib.widgets import CheckButtons

ax = plt.subplot(111)
l0, = ax.plot(s, t, visible=False, lw=2)
l1, = ax.plot(t, s1, lw=2)

rax = plt.axes( [.05, .4, .1, .15] )
check = CheckButtons(rax, ('raw', 'transformed'), (False, True))

def fnx(checkbox_label):
    if checkbox_label == 'raw': 
        l0.set_visible(not l0.get_visible())
    elif checkbox_label == 'transformed': 
        l1.set_visible(not l1.get_visible())

check.on_clicked(fnx)

plt.show()

【问题讨论】:

  • 为了说明为什么plot 返回一个序列,plot 是根据 matlab 的绘图建模的,因此它接受任意数量的线来使用单个函数调用进行绘图. (例如,您可以执行 plt.plot(x, 1*x, x, 2*x, x, 3*x, x, 4*x) 之类的操作并绘制 4 行,或者传入 2d 数组并为每一行获取一行)因此,plot 始终返回一个序列,即使只有一行。用plot 一次绘制多条线实际上是相当罕见的,所以你经常看到l, = plt.plot(x, y)
  • frequently used in Matplotlib 你能链接到文档中的示例吗?

标签: python syntax reference matplotlib


【解决方案1】:

sequence unpacking 表示单个元素。

>>> l = [3]
>>> v, = l
>>> v
3

【讨论】:

    【解决方案2】:
    l, = v
    

    [几乎]与

    相同
    [l] = v
    

    例子

    >>> l=[3]
    >>> [v] = l
    >>> v
    3
    >>>
    

    【讨论】:

      【解决方案3】:

      一些解释:

      我们知道

      a, b = 1, 2
      

      a == 1, b == 2

      在我看来,如果python发现左边是一个“元组”,它会解包右边。

      a, = [1]
      

      python 可能认为它是(a,) = [1]

      然后尝试解压,得到a == 1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 2011-10-30
        相关资源
        最近更新 更多