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

10

Я хотел бы построить графики по 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.

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

Ваш Ответ

3   ответа
1

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]
Я обычно поступаю неправильно, должно быть, мне становится лучше. :) Я проголосовал за оба решения, выбор за принятый ответ был произвольным. enedene
1

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

Ячейка 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()

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

5

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

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

Похожие вопросы