木曜日, 9月 10, 2009

matplotlib 0.98での2次元グラフの上下に違うスケールのメモリを表示させる

examplesを見るとmpl_toolkits.axes_grid.parasite_axesというのを使うのが推奨されているっぽいのだけど、Ubuntuにインストールされている0.98.5.2では使えないのかな?

困ったのですが、これ(*1)を参考にいじったらうまくいきました。

import matplotlib.pyplot

figure = matplotlib.pyplot.figure()
ax1 = figure.add_subplot(111)
ax2 = ax1.twiny()

def update_ax2(ax1):
    def Tr(x):
        return x-offset
    x1, x2 = ax1.get_xlim()
    ax2.set_xlim(Tr(x1), Tr(x2))
    y1, y2 = ax1.get_ylim()
    ax2.set_ylim(y1, y2)
    ax2.figure.canvas.draw()

ax1.callbacks.connect("xlim_changed", update_ax2)
ax1.semilogy(vals)
ax2.semilogy(vals[0:0])
matplotlib.pyplot.show()

実は本当のネックは、semilogyでグラフを書こうとするとax1とax2でY軸に違う目盛を描画してしまう所なのでした。ax1は片対数で描くけどax2では片対数属性が引き継がれないので。面倒なので、ax2にはデータ数0個の片対数グラフを描かせる事で対応しました。

*1 http://matplotlib.sourceforge.net/examples/api/fahrenheit_celcius_scales.html

[追記]
ax2に0個のデータを渡すとスケーリングがマズいっぽい。それ以前にリスケーリングがおかしくなる。このエントリーは無しの方向で orz

0 件のコメント: