2012-05-08 9 views
10

私は4軸、各軸の最初の3つの個別のプロット、最後の軸の最後の3つのプロットを作成したいと考えています。matplotlibでプロットを再利用するにはどうすればよいですか?

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

結果の画像は次のとおりです:
enter image description here
最初のプロットを定義し、軸にそれらを追加し、それらをプロットする方法はあります。ここ は、コードのですか?ここで私は念頭に置いていたロジックは次のとおりです。

#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] 

AX1、AX2上LINE2、AX4上AX3とLINE4のLINE3に今プロットLINE1。

+0

しかし、再度プロットを呼び出すと何が問題になりますか?それは問題を引き起こしていますか? – wim

+0

@wimこの場合、問題はありません。しかし、私はコピー貼り付けを使用する必要がある場合、私は常にコードについて懐疑的です。あるいは、もし私が、例えば、異なる軸上に何らかの形でプロットを並べるある関数に線のプロットを送ることを望むならば。 – enedene

+0

Figureを作成してからサブプロットを追加する代わりに、これを 'fix、ax = plt.subplots(2、2)'のように1行で行うことができます。それで 'ax'は軸の数が少ないので、' ax [0、1] .plot(data、data ** 2/10、ls = ' - '、color = 'g') ' – mmagnuski

答えて

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

は、私はあなたの使用量は罰金だと思いますが、あなたはこのようにplotx,yデータ対のすべてを渡すことができます(それはそれは非常に恐ろしい読み取りになりますが!):

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

面白い別の方法を行うためにこれは次のようなものです:

+0

物事が間違った方法で、私は良くなっているはずです。私は両方の解決策をupvoted、受け入れられた答えの選択は任意であった。 – enedene

0

jupyterノートブックでは、より簡単な使用例がありました。 Figureオブジェクトをどこかに格納しておけば、どうやってそれを再配置できますか? 例:

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

それです。その利点は、図形をオブジェクトに格納し、後で必要に応じて使用できることです。

関連する問題