我正在尝试在图表上绘制一些垂直线,这些线具有整数(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吗?
答案 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坐标列表。此外,您可以使用参数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)
使用transform
参数使从绘图的顶部到底部的线条更容易。您可以详细了解here。您也可以跳过该参数。在这种情况下,您必须在实际的y坐标中指定ymin
和ymax
。
答案 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。