Как мне повторно использовать графики в matplotlib?

Я хотел бы построить графики по 4 осям, первые три отдельных графика по каждой оси и последние все 3 графика по последним осям. Вот код:

<code>from numpy import *
from matplotlib.pyplot import *
fig=figure()
data=arange(0,10,0.01)
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
ax4=fig.add_subplot(2,2,4)

line1=ax1.plot(data,data)
line2=ax2.plot(data, data**2/10, ls='--', color='green')
line3=ax3.plot(data, np.sin(data), color='red')
#could I somehow use previous plots, instead recreating them all?
line4=ax4.plot(data,data)
line4=ax4.plot(data, data**2/10, ls='--', color='green')
line4=ax4.plot(data, np.sin(data), color='red')
show()
</code>

Полученная картина:
enter image description here
Есть ли способ сначала определить графики, а затем добавить их к осям, а затем построить их? Вот логика, которую я имел в виду:

<code>#this is just an example, implementation can be different
line1=plot(data, data)
line2=plot(data, data**2/10, ls='--', color='green')
line3=plot(data, np.sin(data), color='red')
line4=[line1, line2, line3]
</code>

Теперь нарисуйте line1 на ax1, line2 на ax2, line3 на ax3 и line4 на ax4.

 wim08 мая 2012 г., 15:27
Но что не так с повторным вызовом сюжета? Это вызывает некоторые проблемы?
 enedene08 мая 2012 г., 15:38
@ В этом случае никаких проблем не возникает. Но я всегда скептически отношусь к коду, если мне нужно использовать копирование-вставку. Или, если бы я хотел, например, отправить графики линий в какую-либо функцию, которая каким-то образом размещает графики на разных осях.
 mmagnuski08 июн. 2016 г., 22:27
Вместо того, чтобы создавать фигуры, а затем добавлять сюжеты, вы можете сделать это в одну строку:fix, ax = plt.subplots(2, 2), затемax это массив осей, так что вы можетеax[0, 1].plot(data, data**2 / 10, ls='--', color='g')

Ответы на вопрос(3)

Решение Вопроса

что это очень красиво, но по крайней мере это не требует дублирования кода.

import numpy as np, copy
import matplotlib.pyplot as plt, matplotlib.lines as ml

fig=plt.figure(1)
data=np.arange(0,10,0.01)
ax1=fig.add_subplot(2,2,1)
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
ax4=fig.add_subplot(2,2,4)

#create the lines
line1=ml.Line2D(data,data)
line2=ml.Line2D(data,data**2/10,ls='--',color='green')
line3=ml.Line2D(data,np.sin(data),color='red')
#add the copies of the lines to the first 3 panels
ax1.add_line(copy.copy(line1))
ax2.add_line(copy.copy(line2))
ax3.add_line(copy.copy(line3))

[ax4.add_line(_l) for _l in [line1,line2,line3]] # add 3 lines to the 4th panel

[_a.autoscale() for _a in [ax1,ax2,ax3,ax4]] # autoscale if needed
plt.draw()

x,y пары данных дляplot вот так (хотя читать очень ужасно!)

ax4.plot(data, data, data, data**2 / 10, data, np.sin(data))

Забавный другой способ сделать это так:

graph_data = [(data, data), (data, data**2 / 10), (data, np.sin(data))]
[ax4.plot(i,j) for i,j in graph_data]
 enedene09 мая 2012 г., 01:36
Я обычно поступаю неправильно, должно быть, мне становится лучше. :) Я проголосовал за оба решения, выбор за принятый ответ был произвольным.

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

Ячейка 1:

f = plt.figure(figsize=(18, 6))
f.suptitle("Hierarchical Clustring", fontsize=20)
dendrogram(Z, color_threshold=cut_off,
           truncate_mode='lastp',
           p=20)

Ячейка 2:

#plot f again, the answer is really simple
f
plt.show()

Вот и все. Преимущество этого заключается в том, что вы можете хранить фигуры в объектах, а затем использовать их при необходимости.

Ваш ответ на вопрос