Как я могу получить фигуру для обновления после изменения осей объекта в Matplotlib? - PullRequest
2 голосов
/ 19 августа 2011

Пожалуйста, обратитесь к примеру ниже. Добавляются два вспомогательных участка, и в каждый вставляется график Line2D. Затем я изменяю оси Line2D во втором подзаговоре, чтобы он стал первым. Судя по выводу get_geometry, это успешно. Однако на фактическом рисунке два графика Line2D все еще находятся в своих исходных графиках.

Что мне здесь не хватает? Как я могу обновить фигуру, чтобы отразить изменение осей?

Очевидно, что это довольно дебильный пример, реальное приложение носит скорее динамический характер.

Сценарий:

import matplotlib.pyplot as plt

fig = plt.figure()  
ax_1 = fig.add_subplot(2,1,1)
ax_2 = fig.add_subplot(2,1,2)
ax_1.plot([0,1,2],[0,1,2])
ax_2.plot([0,1,2],[2,1,0])

print 'before'
for line in ax_1.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

for line in ax_2.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

f = ax_2.get_lines()[0]
f.set_axes(ax_1)

print 'after'
for line in ax_1.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

for line in ax_2.get_lines():
    print line.get_ydata()
    print line.get_axes().get_geometry()
    print id(line.get_axes())

plt.show()

Выход:

before
[0 1 2]
(2, 1, 1)
4330504912
[2 1 0]
(2, 1, 2)
4336262288
after
[0 1 2]
(2, 1, 1)
4330504912
[2 1 0]
(2, 1, 1)
4330504912

Вывод рисунка: Figure

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

Позже я отправил тот же вопрос здесь , и этот был ответом.

TL, DR Это не поддерживается.

0 голосов
/ 19 августа 2011

Я считаю, что одной из проблем является то, что у ваших первых осей (ax_1) нет той строки, которую вы хотите добавить (f) в их списке линий (ax_1.lines).

Вы можете "скопировать" линию со второго графика на первый с помощью

f = ax_2.lines.pop()  # Removes the line from the second plot
ax_1.plot(*f.get_data())  # Draws a new line in the first plot, but with the coordinates of the second line

(с этим методом, очевидно, нет необходимости делать f.set_axes(ax_1)). Другие аргументы plot() могут быть использованы для того, чтобы также копировать цвет и т. Д., Я думаю.

...