2016-09-27 15 views
2

サブプロットの行に同じカラーバーを共有する必要があります。各サブプロットは、色関数に対して対称の対数スケーリングを有する。これらのタスクのそれぞれは、stackoverflowでここで説明した素晴らしい解決策を持っています:For sharing the color barfor nicely formatted symmetric logarithmic scaling対称対数スケーリングでの複数のサブプロットの1つのカラーバー

しかし、同じコードで両方のトリックを組み合わせると、カラーバー "忘れ"は対称対数であると考えられます。この問題を回避する方法はありますか?生成される出力は次のようである

import numpy as np                     
import matplotlib.pyplot as plt                  
from mpl_toolkits.axes_grid1 import ImageGrid              
from matplotlib import colors, ticker                

# Set up figure and image grid                  
fig = plt.figure(figsize=(9.75, 3))                 

grid = ImageGrid(fig, 111,   # as in plt.subplot(111)           
       nrows_ncols=(1,3),                 
       axes_pad=0.15,                  
       share_all=True,                  
       cbar_location="right",                
       cbar_mode="single",                 
       cbar_size="7%",                  
       cbar_pad=0.15,                  
       )                     

data = np.random.normal(size=(3,10,10))                
vmax = np.amax(np.abs(data))                   

logthresh=4                       
logstep=1                       
linscale=1                       

maxlog=int(np.ceil(np.log10(vmax)))                 

#generate logarithmic ticks                   
tick_locations=([-(10**x) for x in xrange(-logthresh, maxlog+1, logstep)][::-1]      
       +[0.0]                    
       +[(10**x) for x in xrange(-logthresh,maxlog+1, logstep)])       

# Add data to image grid                    
for ax, z in zip(grid,data):                   
    print z                       
    im = ax.imshow(z, vmin=-vmax, vmax=vmax,               
        norm=colors.SymLogNorm(10**-logthresh, linscale=linscale))      

# Colorbar                       
ax.cax.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter())        
ax.cax.toggle_label(True)                   

#plt.tight_layout() # Works, but may still require rect paramater to keep colorbar labels visible 
plt.show() 

テストコードは、私が明白な方法で上記の2つの参照を組み合わせているため、以下、ある enter image description here

答えて

0

あなたが達成しようとしているかということです?

import numpy as np                     
import matplotlib.pyplot as plt                  
from mpl_toolkits.axes_grid1 import ImageGrid              
from matplotlib import colors, ticker                

# Set up figure and image grid                  
fig = plt.figure(figsize=(9.75, 3))                 

grid = ImageGrid(fig, 111,   # as in plt.subplot(111)           
       nrows_ncols=(1,3),                 
       axes_pad=0.15,                  
       share_all=True                                   
       )                     

data = np.random.normal(size=(3,10,10))                
vmax = np.amax(np.abs(data))                   

logthresh=4                       
logstep=1                       
linscale=1                       

maxlog=int(np.ceil(np.log10(vmax)))                 

#generate logarithmic ticks                   
tick_locations=([-(10**x) for x in xrange(-logthresh, maxlog+1, logstep)][::-1]      
       +[0.0]                    
       +[(10**x) for x in xrange(-logthresh,maxlog+1, logstep)])       


# Add data to image grid                    
for ax, z in zip(grid,data):                   
    print z                       
    im = ax.imshow(z, vmin=-vmax, vmax=vmax,               
        norm=colors.SymLogNorm(10**-logthresh, linscale=linscale)) 

cbaxes = fig.add_axes([0.9, 0.125, 0.02, 0.77])      
fig.colorbar(im, format=ticker.LogFormatter(), ticks=tick_locations, cax = cbaxes) 
ax.cax.toggle_label(True) 


#plt.tight_layout() # Works, but may still require rect paramater to keep colorbar labels visible 
plt.show() 

出力:エルバAitbayevによって溶液に基づいて enter image description here

+0

はい、これは私が達成しようとしていたものです。あなたの答えに基づいて、元のサンプルコードを変更して、ソリューションのように軸の寸法を手動で調整する必要がなくなりました。私はそれを行うための好ましい方法だと思うので、私は別の答えとしてこれを投稿します。 – mjo

0

、私はそれがラインに元々ラインによって投稿のコード例では

ax.cax.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter()) 

を交換すればよいことがわかりました

fig.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter(), cax = ax.cax) 

となり、カラーバーの明示的な寸法を指定する必要はありません。なぜ私は1つが動作し、もう1つは動作しないのか分かりません。対応するコメントin the post on sharing colorbarsを追加するとよいでしょう。私はチェックし、カラーバーが上の2つの選択肢の2番目と同じように呼び出された場合、その例の線形カラースケールはまだ機能します。 (私はそこにコメントを追加するには十分な評判がありません)

関連する問題