2016-12-02 15 views
3

1つのパラメータが異なり、1つの図にプロットしたい複数の曲線があります。それらを区別するために、matplotlibのカラーバーの1つを使用したいと思います。そうするために、私は上記のパラメータに応じて色のリストを作成します。また、使用する色を説明するためにカラーバーを追加したいと思います。私はそのすべてを簡単に行うことができます。問題は今や、利用可能なカラーマップの一部だけを使用したいと思っています。それは明るすぎるため、ある閾値を超えてはほとんど見えません。しかし、今ではサブレンジでのみ色を選択すると、表示されるカラーバーの範囲を調整する方法が見つかりませんでした。結果は見matplotlibのカラーバーの一部だけを使用してプロットする方法は?

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

gs = gridspec.GridSpec(2, 1, 
         height_ratios=[1, 4] 
         ) 
ax = [plt.subplot(g) for g in gs] 

parameterToColorBy = np.linspace(5, 10, 6, dtype=float) 

maxColor = 0.85 
colors = [plt.get_cmap("inferno")(i) 
      for i in np.linspace(0, maxColor, parameterToColorBy.shape[0])] 

norm = mpl.colors.Normalize(parameterToColorBy[0], 
          parameterToColorBy[0]+ 
          (parameterToColorBy[-1]-parameterToColorBy[0])/ 
          maxColor) 
cb = mpl.colorbar.ColorbarBase(ax[0], 
           cmap="inferno", 
           norm=norm, 
           ticks=parameterToColorBy, 
           orientation='horizontal') 
ax[0].xaxis.set_ticks_position('top') 

for p, c in zip(parameterToColorBy, colors): 
    ax[1].plot(np.arange(2)/p, c=c) 

plt.show() 

次のとおりです:ここで

は私が達成したいものの(ほぼ)最小限の例です。私は今、カラーバーが10で停止したい

starting point

しかし、ax[0].set_xlim(0, maxColor)という行を追加してサブプロットのxlimを調整するだけでは、色付きの部分は正しく調整されますが、周囲のボックスは台無しです。

Result of set_xlim

また、カラーバーの機能を見つけましたset_clim。しかし、これは正規化を変更するだけで、私が望むようには動作しないようです。変更された色が、そのまま軸にcb.set_clim(parameterToColorBy[0], parameterToColorBy[-1])結果を追加:

私は必要なように見える何

Result of set_xlim

表示カラーバーの制限を調整するための適切な方法、またはサブセットとして独自のカラーバーを作成する方法のいずれかであります使用可能なカラーバーを表示します。これらのことを達成する方法はありますか?

+1

はあなただけ(例えば、0.0から0.9)の代わりにもう一方の端にlinspaceを制限し、このhttp://stackoverflow.com/a/26105100/189050を使用してもらえますか? – Deditos

+0

@Deditos提案していただきありがとうございます。私はおそらく、多くの点を使ってこれらの線に沿って何かを行い、大まかに連続したカラーマップを得ることができます。しかし、私は彼の答えでtomによって提案された解決策を好むと思う。 – jotasi

答えて

3

私は以下のコードで書いたtruncate_colormap関数を使用してカラーマップを切り捨てることができます。既存のカラーマップから新しいmatplotlib.colors.LinearSegmentedColormapを作成します。あなたはmaxColorNormaliseインスタンスをスケーリングする必要はありませんし、あなたがあなたのcolorsリストとcolorbarを作成するときに、この新しいカラーマップのインスタンスを使用する必要が

注意。

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import matplotlib.colors as mcolors 

gs = gridspec.GridSpec(2, 1, 
         height_ratios=[1, 4] 
         ) 
ax = [plt.subplot(g) for g in gs] 

parameterToColorBy = np.linspace(5, 10, 6, dtype=float) 

def truncate_colormap(cmap, minval=0.0, maxval=1.0, n=-1): 
    if n == -1: 
     n = cmap.N 
    new_cmap = mcolors.LinearSegmentedColormap.from_list(
     'trunc({name},{a:.2f},{b:.2f})'.format(name=cmap.name, a=minval, b=maxval), 
     cmap(np.linspace(minval, maxval, n))) 
    return new_cmap 

minColor = 0.00 
maxColor = 0.85 
inferno_t = truncate_colormap(plt.get_cmap("inferno"), minColor, maxColor) 

colors = [inferno_t(i) 
      for i in np.linspace(0, 1, parameterToColorBy.shape[0])] 

norm = mpl.colors.Normalize(parameterToColorBy[0], 
          parameterToColorBy[-1]) 

cb = mpl.colorbar.ColorbarBase(ax[0], 
           cmap=inferno_t, 
           norm=norm, 
           ticks=parameterToColorBy, 
           orientation='horizontal') 

ax[0].xaxis.set_ticks_position('top') 

for p, c in zip(parameterToColorBy, colors): 
    ax[1].plot(np.arange(2)/p, c=c) 

plt.show() 

enter image description here

関連する問題