Соединение двух точек в 3D-диаграмме рассеивания в Python и matplotlib

Как в приведенном ниже коде создать линии, соединяющие каждую пару точечных диаграмм (т. е. связывающие зеленый кружок с желтой стрелкой), созданные двумя строками кода ближе к концу непосредственно перед инструкцией .show()?

import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D

dates       = [20020514, 20020515, 20020516, 20020517, 20020520]
highs       = [1135, 1158, 1152, 1158, 1163]
lows        = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]

zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]

fig = matplotlib.pyplot.figure()
ax  = fig.add_subplot(111, projection = '3d')

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r')

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o")
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^")

matplotlib.pyplot.show()

person Zambi    schedule 13.05.2012    source источник


Ответы (1)


Нарисуйте отрезок между этими точками:

import matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D

dates       = [20020514, 20020515, 20020516, 20020517, 20020520]
highs       = [1135, 1158, 1152, 1158, 1163]
lows        = [1257, 1253, 1259, 1264, 1252]
upperLimits = [1125.0, 1125.0, 1093.75, 1125.0, 1125.0]
lowerLimits = [1250.0, 1250.0, 1156.25, 1250.0, 1250.0]

zaxisvalues0= [0, 0, 0, 0, 0]
zaxisvalues1= [1, 1, 1, 1, 1]
zaxisvalues2= [2, 2, 2, 2, 2]

fig = matplotlib.pyplot.figure()
ax  = fig.add_subplot(111, projection = '3d')

ax.plot(dates, zaxisvalues1, lowerLimits, color = 'b')
ax.plot(dates, zaxisvalues2, upperLimits, color = 'r')

for i,j,k,h in zip(dates,zaxisvalues0,lows,highs):
    ax.plot([i,i],[j,j],[k,h],color = 'g')

ax.scatter(dates, zaxisvalues0, highs, color = 'g', marker = "o")
ax.scatter(dates, zaxisvalues0, lows, color = 'y', marker = "^")

matplotlib.pyplot.show()

Производит:

введите здесь описание изображения

person Mark    schedule 13.05.2012
comment
Превосходно! Спасибо, Марк. Я никогда не понимал, что могу отображать отдельные точки по желанию (вместо серии в массиве или списке). А что, если я хочу нарисовать прямоугольник вместо линии? Я попытался изменить ax.plot на ax.bar в вашем цикле for, но вместо этого получил перекошенные линии. Есть ли способ нарисовать прямоугольник? Заранее спасибо. - person Zambi; 14.05.2012
comment
@Zambi Добро пожаловать в Stackoverflow! Вместо того, чтобы добавлять дополнительные вопросы, имеет смысл задать новый вопрос. - person Hooked; 14.05.2012
comment
Замби, как сказал @Hooked, лучше открыть новый вопрос, чтобы его увидело более широкое сообщество. Тем не менее, у вас есть два варианта: нарисовать 4 стороны прямоугольника с помощью сюжетных линий или изучить использование PolyCollection (matplotlib.sourceforge.net/examples/mplot3d/polys3d_demo.html) - person Mark; 15.05.2012
comment
Зацепил и Марк спасибо. Опубликован новый вопрос. (stackoverflow.com/questions/10599942/) - person Zambi; 15.05.2012