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

时间:2014-01-23 06:28:59

标签: 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')

生成此错误:

  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()

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

4 个答案:

答案 0 :(得分:9)

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

[pylab.axvline(_x, linewidth=1, color='g') for _x in x]

答案 1 :(得分:3)

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

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)

答案 2 :(得分:2)

出于完整性考虑,还可以使用matplotlib.pyplot s vlines。此函数接受x坐标列表。此外,您可以使用参数yminymax指定行在何处开始/结束。对于此问题,代码为:

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)

使用transform参数使从绘图的顶部到底部的线条更容易。您可以详细了解here。您也可以跳过该参数。在这种情况下,您必须在实际的y坐标中指定yminymax

答案 3 :(得分:1)

axvline用于创建x 垂直行。

从y-min到y-max的证书x点的含义

x不能是list类型。

一个简单的例子:

axvline(x=.5, ymin=0.25, ymax=0.75)

您可以阅读更多here

如果要创建矩形,可以使用:

axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)

在你的情况下,xmin为1,x man为300。