2013-05-25 5 views
6

コードはcreates figures from input.txt filesです。これらの数字のうち2つを1つのサブプロットにまとめる必要があります。図1.からのデータは軸xとyに同じ伝説を共有し、左のサブプロットで、右のサブプロットで図2.からプロットし、彼と同じ規模withtされます。matplotlib:異なる数字を組み合わせて共通の凡例を共有する単一のサブプロットに入れます

enter image description here

ここではいくつかの例のデータがあります:

x = [ 1, 2, 3, 5, 10, 100, 1000 ] 
y1 = [ 1, 0.822, 0.763, 0.715, 0.680, 0.648, 0.645 ] 
y2 = [ 1, 0.859, 0.812, 0.774, 0.746, 0.721, 0.718 ] 

import matplotlib.pyplot as plt 
# mode 01 from one case 
fig1 = plt.figure() 
ax1 = fig1.add_subplot(111) 
ax1.plot(x, y1, label='mode 01') 
# mode 01 from other case 
fig2 = plt.figure() 
ax2 = fig2.add_subplot(111) 
ax2.plot(x, y2, label='mode 01') 

EDIT:@nordev作品によって提案された方法。今度は、より多くの情報を持っているので、ax1オブジェクトとax2オブジェクトを新しいフィギュアに渡すのが本当に便利です。 It seems that there is no straightforward way to achieve that

real case has been made available here。それを動作させるには、plot_both.pyを実行してください。


EDIT2:input.txtファイルを読み取るルーチンを変更する方が簡単でした。 Now it supports multiple plots。しかし、AxesSubplotを異なる数字、サブプロットなどの間で簡単に交換可能なオブジェクトとして扱うことは素晴らしいことになるので、この質問はまだ有効です。

+1

「sharey」オプションを使用して、これらのデータを2つのサブプロットとして1つの図に単純にプロットすることはできません。 2つの別個の図を作成してから、その図を抽出して新しい図形に結合する必要があります。 – hooy

+0

私はshareyオプションを試しましたが、データ自体ではなく[軸の制限とビュー](http://matplotlib.org/users/recipes.html)のみを共有しているようです...現在のコードではこれらの個体を作成しています数字、私はこのコードを変更する前にそれらを組み合わせてみたいと思います... –

+0

私はまだそれがあなたが達成したいことを完全に理解していません。含まれたサンプルプロット(画像#1)から、y軸は共有され、各プロットのデータは1つのサブプロット_にのみプロットされます。つまり、プロットは独立しています。上のあなたのコメントから、_both_行を_both_のサブプロットにプロットしたいと思うでしょうか?たとえば、サブプロット番号1にのみプロットされた行番号1と、サブプロット番号2にのみプロットされた2行目(y軸には同じy軸がある)が必要な場合は、これは簡単です。また、 'ax1.plot(...'? – hooy

答えて

7

これで問題は解決しますか?

x = [ 1, 2, 3, 5, 10, 100, 1000 ] 
y1 = [ 1, 0.822, 0.763, 0.715, 0.680, 0.648, 0.645 ] 
y2 = [ 1, 0.859, 0.812, 0.774, 0.746, 0.721, 0.718 ] 

import matplotlib.pyplot as plt 
from matplotlib.transforms import BlendedGenericTransform 
# mode 01 from one case 
fig1 = plt.figure() 
ax1 = fig1.add_subplot(111) 
line1, = ax1.plot(x, y1, label='mode 01') 
# mode 01 from other case 
fig2 = plt.figure() 
ax2 = fig2.add_subplot(111) 
line2, = ax2.plot(x, y2, label='mode 01') 

# Create new figure and two subplots, sharing both axes 
fig3, (ax3, ax4) = plt.subplots(1,2,sharey=True, sharex=True,figsize=(10,5)) 

# Plot data from fig1 and fig2 
line3, = ax3.plot(line1.get_data()[0], line1.get_data()[1]) 
line4, = ax4.plot(line2.get_data()[0], line2.get_data()[1]) 
# If possible (easy access to plotting data) use 
# ax3.plot(x, y1) 
# ax4.lpot(x, y2) 

ax3.set_ylabel('y-axis') 
ax3.grid(True) 
ax4.grid(True) 

# Add legend 
fig3.legend((line3, line4), 
      ('label 3', 'label 4'), 
      loc = 'upper center', 
      bbox_to_anchor = [0.5, -0.05], 
      bbox_transform = BlendedGenericTransform(fig3.transFigure, ax3.transAxes)) 
# Make space for the legend beneath the subplots 
plt.subplots_adjust(bottom = 0.2) 
# Show only fig3 
fig3.show() 

enter image description here

編集

の下に見られるように、これは、アップロードしたzipファイル内のコードを見てみると、出力を与え、私は要求された機能の大部分が達成されるでしょうね?

プロットを作成する機能を変更して、別の図から2つのサブプロットを「マージ」しようとしていないため、問題を根本的に解決することができます。あなたのソリューションは基本的には、同じ数字上に同じ図のサブプロットとしてAxesのインスタンスを作成していて、ならプロットではなく、プロットを作成してから、あなたの質問が元々のものだったので、軸を動かしてください。私が疑われるよう

は、最も簡単で自明な解決策は、(もし容易に達成されていない別のFigureから1つのAxesインスタンスを移動させるように、代わりに、それらは別々の図面に関連付けられ有する同図の個々Axesサブプロットを作ることです可能であれば)、コメントに指定されています。 Figure_axstackAxesインスタンスを単に追加するだけで、目的のレイアウトにカスタマイズすることが難しくなるため、「元の」問題はまだ達成するのが難しいようです。

伝説を作るためにあなたの現在のコードの ax.legend(...に対する一つの変更は、単に軸下の最上部に、水平方向の中央

:ここ

# Add this line 
from matplotlib.transforms import BlendedGenericTransform 

# Edit the function call to use the BlendedGenericTransform 
ax.legend(loc='upper center', 
      ncol=7, 
      labelspacing=-0.7, 
      columnspacing=0.75, 
      fontsize=8, 
      handlelength=2.6, 
      markerscale=0.75, 
      bbox_to_anchor=(0.5, -0.05), 
      bbox_transform=BlendedGenericTransform(fig.transFigure, ax.transAxes)) 

bbox_to_anchor引数はの境界内に収まるようにカスタマイズする必要があります私たちの姿。

BlendedGenericTransformは、x軸とy軸の変換が異なることを可能にします。これは、多くの状況で非常に便利です。

+0

ありがとうございました!今、私は新しい図形にAxesSubplotオブジェクトを渡して、 fig1とfig2の情報をより効率的に... –

+3

@SaulloCastro [このコメントによる](http://stackoverflow.com/questions/6309472/matplotlib-can-i-create-axessubplot-objects-then-add-themジョー・キングトン(Deece)のフィギュア・インスタンス#comment18919455_6309636) ber '12)、Axesインスタンスは意図的に人物間で共有されることは想定されておらず、あなたの要求はかなり困難になります。 – hooy

+1

私は実際のケースへのリンクを使って質問を更新した –

関連する問題