2017-09-07 6 views
2

次のスクリプトを使用して、2つのy軸と共通のx軸を持つ情報を表示しています。この後対話型ズームツールを使用してMatplotlibを使って軸の限界を再調整する(ホストプロットに追加)方法はありますか?

import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import host_subplot 
import mpl_toolkits.axisartist as AA 

#creating a host plot with x and y axis 
hostplot = host_subplot(111, axes_class=AA.Axes) 

#creating a second y axis 
extra_y_axis = hostplot.twinx() 
extra_y_axis.set_navigate_mode(True) 
extra_y_axis.set_navigate(True) 
print extra_y_axis.can_zoom() #prints true on output 

hostplot.set_xlabel("host_x") 
hostplot.set_ylabel("host_y") 
extra_y_axis.set_ylabel("extra_y") 

hostplot.plot([0, 1, 2], [0, 1, 2]) 
extra_y_axis.plot([0, 1, 2], [0, 3, 2]) 

plt.draw() 
plt.show() 

以下に示すようにIは、左下にトレイから「ズーム矩形に」ツールを使用:

as shown

following output

そして、私は次の出力を得ました。

両方の画像でy軸の目盛りに注意してください。ズーム機能はホストプロットで正しく機能していますが、extra_y_axisを再スケーリングすることはできず、一定のスケールを維持しています(2番目の軸を使用してプロットを拡大することはできません)。

どのようにすべての軸が小さな部分のズームで再スケーリングされるようにすることができますか?

おかげ

答えて

0

私はaxes_grid1ツールキットのスーにあなたの問題を下にトレースしてきました。あなたはこのツールキットを使用する必要がない場合は、簡単に通常の方法であなたの姿を初期化することで、あなたの問題を解決することができます

import matplotlib.pyplot as plt 
#creating a host plot with x and y axis 
fig, hostplot = plt.subplots() 

#creating a second y axis 
extra_y_axis = hostplot.twinx() 

hostplot.set_xlabel("host_x") 
hostplot.set_ylabel("host_y") 
extra_y_axis.set_ylabel("extra_y") 

hostplot.plot([0, 1, 2], [0, 1, 2]) 
extra_y_axis.plot([0, 1, 2], [0, 3, 2]) 

plt.show() 

ツールキットを使用したいならば、あなたは数行を追加する必要があります2つのy軸を一緒にスケーリングして変換する:

import matplotlib.transforms as mtransforms 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1.parasite_axes import SubplotHost 

fig = plt.figure() 
ax1 = SubplotHost(fig, 1, 1, 1) 

#set the scale difference between the two y axes 
aux_trans = mtransforms.Affine2D().scale(sx = 1.,sy= 1.5) 
ax2 = ax1.twin(aux_trans) 

fig.add_subplot(ax1) 

ax1.plot([0, 1, 2], [0, 1, 2]) 
ax2.plot([0, 1, 2], [0, 3, 2]) 
ax1.set_ylim(0,3) 

plt.show() 
+0

ありがとうございます!しかし、sxとsyを自動的に設定する方法はありませんか?通常、あなたが持つデータは不明です。あなたは手動で最大値と最小値をチェックし、それに応じてそれを設定すると思います。しかし、私はそれが図書館によって行われるべきであると思った。 – ornuthewolf

+0

私はそれが私が記述した最初の方法を使用するのが最も簡単だと思うし、それでmatplotlibはそれを自分自身で処理します。私はツールキットの専門家ではありません(あなたの質問は初めて見ました)ので、ツールキットの軸をどのようにスケールするかについてはまだコメントできません。 – Tkanno

+0

それは私が最終的にしたものです。私は実際にはmpl_toolkits.axes_grid1の機能を必要とせず、matplotlib.pyplotだけを使用して切り替えたことに気付きました。とにかく、助けてくれてありがとう! – ornuthewolf

関連する問題