2017-02-01 7 views
1

画像とカラーバーの下に、関連するヒストグラムをプロットします。画像の2つの軸とヒストグラムは同じ幅でなければなりません。 さらに、カラーバーは画像と同じ高さにする必要があります。 複雑な部分は、累積ヒストグラムのプロットとデータのサイズに関する各ビンの割合を重ねることです。私はAX2上TWINXを使用しようとするまで、すべてが(異なるyスケールとAX3の私の累積分布をプロットするために)スムーズに起こっているtwinxをmake_axes_locatableで作成したaxで表現する方法

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 


data = np.random.normal(0,2,size=(100,100)) 

fig  = plt.figure() 
ax  = fig.add_subplot(2,1,1) 
im  = ax.imshow(data,cmap="bone") 
divider = make_axes_locatable(ax) 
ax1  = divider.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(im,cax=ax1) 
ax2  = divider.append_axes("bottom",size="100%",pad = 0.3) 
n,bins,patches = ax2.hist(data.flatten(),bins=20) 
ax3  = ax2.twinx() 
ax3.plot(bins[:-1],np.cumsum(n*100/np.size(data)),lw=2) 

plt.show() 

:瞬間のために

は、私はこのような何かを得ました。結果の軸は、ax2ではなく、図のすべての軸をラップしています。

私は何が間違っているのか、これをどのように修正できるのか分かりません。

答えて

2

これは難しいです。問題は、axes_grid1ツールキットが描画時に軸を配置するように設計されていることです。どうやらそれは最初に双子軸を描き、その後に分周器に従って軸を再配置します。
等しくないアスペクト比を持つ軸を、等しくない軸を持つ軸にバインドしたい場合は、AxisGridを使用できなくなります。

等+不等または等しい+双対または不等+双子のいずれかの2つの組み合わせが一方向または他の方法で機能する一方で、3つすべてがあまりにも多すぎます。

解決策はおそらく最初から開始し、軸をキャンバスに置き、最後にのみ再配置/サイズ変更します。これは、等しいアスペクトの軸の位置を取得し、それに応じて他の2つの軸のサイズを変更する関数に接続されたイベントリスナを使用して行うことができます。

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

data = np.random.normal(0,2,size=(100,100)) 

fig  = plt.figure() 
ax = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 

im  = ax.imshow(data,cmap="bone") 
n,bins,patches = ax2.hist(data.flatten(),bins=20) 

divider = make_axes_locatable(ax) 
cax  = divider.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(im, cax=cax) 

ax3  = ax2.twinx() 
ax3.plot(bins[:-1],np.cumsum(n*100/np.size(data)),lw=2, c=plt.cm.bone(0.4)) 

def resize(event): 
    axpos = ax.get_position() 
    axpos2 = ax2.get_position() 
    newpos = [axpos.x0, axpos2.y0, axpos.width, axpos2.height] 
    ax2.set_position(newpos) 
    ax3.set_position(newpos) 

cid = fig.canvas.mpl_connect('draw_event', resize) 
cid2 = fig.canvas.mpl_connect('resize_event', resize) 

#if you want to save the figure, trigger the event manually 
save=False 
if save: 
    fig.canvas.draw() 
    resize() 
    plt.savefig(__file__+".png") 
plt.show() 

enter image description here

関連する問題