matplotlib axvline真相模糊或列表问题?

use*_*972 11 python matplotlib

我试图在图表上绘制一些垂直线,其中包含整数(1 ... 300)和一些"值"(浮点数)的"列表".当x = [48]时,以下工作,但当x设置为x = [48,83,155,292]时,以下代码:

pylab.plot(list, values, label='Trend', color='k', linestyle='-')
pylab.axvline(x, linewidth=1, color='g')
Run Code Online (Sandbox Code Playgroud)

生成此错误:

  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2053, in axvline
    ret = ax.axvline(x, ymin, ymax, **kwargs)   File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3478, in axvline
    scalex = (xx<xmin) or (xx>xmax) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

这是什么意思?(我认为python假装知道真相何时模棱两可,这很有趣).我可以不将列表传递给axvline吗?

nye*_*e17 11

不,你不能将列表传递给axvline.对于一行内的多条垂直线,这样的事情就可以了

[pylab.axvline(_x, linewidth=1, color='g') for _x in x]
Run Code Online (Sandbox Code Playgroud)


wes*_*str 7

为了完整起见,还可以使用matplotlib.pyplots vlines。此函数接受 x 坐标列表。此外,您可以使用参数ymin和指定行需要开始/结束的位置ymax。在这个问题的情况下,代码将是:

import matplotlib.transforms as mt

fig, ax = plt.subplots()
ax.plot(list, values, label='Trend', color='k', linestyle='-')

trans = mt.blended_transform_factory(ax.transData, ax.transAxes)
ax.vlines(x, ymin=0, ymax=1, linewidth=1, color='g', transform=trans)
Run Code Online (Sandbox Code Playgroud)

使用该transform参数可以更轻松地从绘图的顶部到底部绘制线条。您可以在此处阅读更多相关信息。您也可以跳过该参数。在这种情况下,你必须指定ymin,并ymax在实际y坐标。

  • 更优雅的选项是“ax.get_xaxis_transform()”,它处理返回混合变换。 (2认同)

das*_*esy 5

axvline我们可以使用plot命令本身,而不是多次调用,但可以提供正确的转换(如果有很多行,这可以快很多倍):

import matplotlib.transforms as tx
ax = pylab.gca()
trans = tx.blended_transform_factory(ax.transData, ax.transAxes)
pylab.plot(np.repeat(x, 3), np.tile([.25, .75, np.nan], len(x)), linewidth=2, color='g', transform=trans)
Run Code Online (Sandbox Code Playgroud)