2014-01-23 1 views
6

Я пытаюсь построить некоторые вертикальные линии на диаграмме, которая имеет «список» целых чисел (1 ... 300) и некоторые «значения» (плавает). Следующие работы, когда х = [48], но когда х установлено значение х = [48, 83, 155, 292], следующий код:matplotlib axvline правда двусмысленная или список вопросов?

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

Что это значит? (Я думал, что довольно забавно, что питон притворяется, что знает, что правда двусмысленна). Могу ли я передать список axvline?

ответ

7

Нет, вы не можете передать список axvline. Для несколько вертикальных линий в пределах одной линии, что-то, как это будет делать

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

axvline предназначено для создания x вертикальная линия.

Значение в точке certin x от y-min до y-max.

x не может быть list.

простой пример:

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

Вы можете прочитать больше here

Если вы хотите, чтобы создать прямоугольник вы можете использовать:

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

в вашем случае Xmin является 1 и х человек - 300.

2

Вместо нескольких вызовов 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) 
+0

Это должен быть принятый ответ. –

Смежные вопросы