2017-11-10 5 views
1

"ColorbarBase"オブジェクトを使用してカラーバーを作成し、 "set_yticklabels"メソッドでティックを追加すると、matplotlibは "ティック"リストで指定された値の半分までを表示します。これは、私が最新のmatplotlibバージョンにアップグレードした後に起き始めました。ここでMatplotlibのカラーバーにティック値の半分しか表示されない

はそれをテストするための短いコードです:

matplotlibのバージョン2.1.0を使用して
import matplotlib.pyplot as plt 
    import matplotlib as mpl 
    fig = plt.figure(1) 
    cax = fig.add_axes([0.8, 0.15, 0.03, 0.72]) 
    ticks = range(11) 
    cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical') 
    cbar.ax.set_yticklabels(ticks) 
    plt.show() 

私は1から5まで行くティックでカラーバーを取得し、一方matplotlibのバージョン1.4.3と私は正しいを取得します1から10までのティックを持つ数字。

ティックの範囲を2つ増やしてダーティな修正を行うことができますが、このようなことは起こりたくありません。何が起こっているのかについてのヒント?

答えて

0

私は、上記のコードはmatplotlib 1.4で動作すると思います。要点は、カラーバーにどの範囲をカバーするべきかを教えないということです。したがって、0 - 1の範囲をカバーします。 2より下のmatplotlibバージョンでは、範囲が0 - 1の軸は11個の目盛り(0,0.1,0.2,...)を持ちます。ラベルをrange(11)として設定するとうまく収まります(0は0、0.1は1などとなります)。より新しいmatplotlibバージョンでは、ラベルの密度はデフォルトで低くなります(0,0.2,0.4,...)。したがって、あなたはラベルを5つまでしか得ることができません(0は0、0.2はラベル1、0.4は2とラベル付けされ、5までなど)。最後に、このアプローチはとにかく非常に脆弱です。ティック密度は軸の大きさにも影響され、変化する可能性があるからです。

このように、どの範囲をカバーするべきかをカラーバーに伝えたいとします。これを行う1つの方法は、normを提供することです。

ticks = range(11) 
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
           norm=plt.Normalize(ticks[0],ticks[-1])) 

その後、ticks内の数字にダニやticklabelsを設定することができます。

cbar.set_ticks(ticks) 
cbar.ax.set_yticklabels(ticks) 

コンプリート例:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
fig = plt.figure(1) 
cax = fig.add_axes([0.8, 0.15, 0.03, 0.72]) 
ticks = range(11) 
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
           norm=plt.Normalize(ticks[0],ticks[-1])) 
cbar.set_ticks(ticks) 
cbar.ax.set_yticklabels(ticks) 
plt.show() 

enter image description here

+0

は、あなたの答えをありがとう!これは私のコードの大半で動作します。 –

+0

なぜ大部分のみですか?最も一般的ですが、私は言うでしょう。それ以上の説明が必要な場合は、それについて尋ねることができます。また、[誰かの回答](https://stackoverflow.com/help/someone-answers)もお読みください。 – ImportanceOfBeingErnest

+0

ねえ、申し訳ありませんが、間違ってメッセージを送信しましたが、修正する時間がありませんでした。最後のティックで文字列を使用して、より大きいまたは等号を表示するケースが1つあります(たとえば、「> = 10」)。 "plt.norm"を使用するとエラーが発生します。これは数字のみで動作するためです。そのような場合にソリューションを動作させることは可能ですか? –

関連する問題