2017-03-11 8 views
4

における異なるX軸及びY軸スケールを有するものプロットで私は1つの軸上に3つのグラフが欲しいは、例えば、オブジェクト:2つ(またはそれ以上)のグラフパイソン

#example x- and y-data 
x_values1=[1,2,3,4,5] 
y_values1=[1,2,3,4,5] 

x_values2=[-1000,-800,-600,-400,-200] 
y_values2=[10,20,39,40,50] 

x_values3=[150,200,250,300,350] 
y_values3=[10,20,30,40,50] 


#make axes 
fig=plt.figure() 
ax=fig.add_subplot(111) 

は、今はすべての3つを追加しますデータセットをaxにします。しかし、はx軸またはy軸を共有するべきではありません(それ以来、異なるスケールのため、他のものよりも小さいものがあります)ax.twinx()、ax.twiny()

2つの添付されたプロット(および第2のプロットに類似する第3のプロット)を1つのプロット( " )「互いの上にそれらを置く。 Plot1Plot2

Iは右/上部及びX/Y上の第2のプロットのX/Y-標識(及び/又はダニ、限界)を置きます - 左下の別のプロットの制限/左。私は3.プロットのx/y-ラベルが必要ない。

どうすればよいですか? この問題に関するすべてのリンク/ヒント/回答に感謝します。

ps:これはstackoverflowに関する私の最初の質問です。私がスタイルガイドを遵守しなかった場合や、間違った方法で尋ねた場合、私は裸でいます。もしそうなら、私に知らせてください!

+0

この記事の最初の答えが役立つかもしれないいくつかの情報があります。http://stackoverflow.com/questions/7733693/matplotlib-overlay-plots-with-different-scales – Tristan

答えて

8

考えられるのは、同じ位置に3つのサブプロットを作成することです。確実にするために、彼らは異なるプロットとして認識され、それらのプロパティは異なる必要があります - これを達成する最も簡単な方法は単に別のラベル、ax=fig.add_subplot(111, label="1")を提供することです。

残りの部分は、結果のプロットが魅力的に見えるように、すべての軸パラメータを調整するだけです。 すべてのパラメータを設定する作業は少しですが、必要な作業は次のとおりです。

enter image description here

import matplotlib.pyplot as plt 

x_values1=[1,2,3,4,5] 
y_values1=[1,2,2,4,1] 

x_values2=[-1000,-800,-600,-400,-200] 
y_values2=[10,20,39,40,50] 

x_values3=[150,200,250,300,350] 
y_values3=[10,20,30,40,50] 


fig=plt.figure() 
ax=fig.add_subplot(111, label="1") 
ax2=fig.add_subplot(111, label="2", frame_on=False) 
ax3=fig.add_subplot(111, label="3", frame_on=False) 

ax.plot(x_values1, y_values1, color="C0") 
ax.set_xlabel("x label 1", color="C0") 
ax.set_ylabel("y label 1", color="C0") 
ax.tick_params(axis='x', colors="C0") 
ax.tick_params(axis='y', colors="C0") 

ax2.scatter(x_values2, y_values2, color="C1") 
ax2.xaxis.tick_top() 
ax2.yaxis.tick_right() 
ax2.set_xlabel('x label 2', color="C1") 
ax2.set_ylabel('y label 2', color="C1")  
ax2.xaxis.set_label_position('top') 
ax2.yaxis.set_label_position('right') 
ax2.tick_params(axis='x', colors="C1") 
ax2.tick_params(axis='y', colors="C1") 

ax3.plot(x_values3, y_values3, color="C3") 
ax3.set_xticks([]) 
ax3.set_yticks([]) 

plt.show() 
+0

優秀を!それはまさに私が必要とする答えです!私は同じポジションに複数のサブプロットを持つことができたことを知らなかった(または考えました)...ありがとう! –

+0

はい、一般的なトラップは、異なる引数を渡すことで防ぐことができる、同じサブプロットを何回か作成することです。だから、これが質問に答えるなら、未解決のままにならないように[回答を受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を検討してください。 – ImportanceOfBeingErnest

0

また、同じ制限を共有するようにデータを標準化した後、所望の第2のスケール「手動」の限界をプロットすることができました。 この関数は、点の第一のセットの限界にデータを標準化:

def standardize(data): 
    for a in range(2): 
     span = max(data[0][a]) - min(data[0][a]) 
     min_ = min(data[0][a]) 
     for idx in range(len(data)): 
      standardize = (max(data[idx][a]) - min(data[idx][a]))/span 
      data[idx][a] = [i/standardize + min_ - min([i/standardize 
          for i in data[idx][a]]) for i in data[idx][a]] 
    return data 

そして、データをプロットすることは容易である:

import matplotlib.pyplot as plt 
data = [[[1,2,3,4,5],[1,2,2,4,1]], [[-1000,-800,-600,-400,-200], [10,20,39,40,50]], [[150,200,250,300,350], [10,20,30,40,50]]] 
limits = [(min(data[1][a]), max(data[1][a])) for a in range(2)] 

norm_data = standardize(data) 

fig, ax = plt.subplots() 

for x, y in norm_data: 
    ax.plot(x, y) 

ax2, ax3 = ax.twinx(), ax.twiny() 
ax2.set_ylim(limits[1]) 
ax3.set_xlim(limits[0]) 

plt.show() 

すべてのデータポイントは、最初のセットの限界を持っているので私たちは同じ軸にそれらをプロットすることができます。次に、所望の第2のx軸およびy軸の限界を用いて、これらの2つの限界を設定することができる。

Rsulting plot

+1

これでもうまくいく - ありがとう! –

関連する問題