2012-06-28 17 views
115

プロットで選択したいくつかのティックラベルにいくつかの変更を加えたいと思います。ティックラベルのテキストを変更する

label = axes.yaxis.get_major_ticks()[2].label 
label.set_fontsize(size) 
label.set_rotation('vertical') 

をフォントサイズと目盛りラベルの向きが変更された:私がしなければたとえば、

。しかし

、しようとした場合:目盛りラベルが変更されないある

label.set_text('Foo') 

。また、私がする場合:

print label.get_text() 

何も印刷されていません。

ここでもう少し違和感があります。私はこれをしようとしたときに:

from pylab import * 
axes = figure().add_subplot(111) 
t = arange(0.0, 2.0, 0.01) 
s = sin(2*pi*t) 
axes.plot(t, s) 
for ticklabel in axes.get_xticklabels(): 
    print ticklabel.get_text() 

だけ空の文字列が印刷されているが、プロットは、 '0.0'、 '0.5'、 '1.0'、 '1.5' と標識されたダニが含まれ、そして '2.0'。

#ax is the axes instance 
group_labels = ['control', 'cold treatment', 
      'hot treatment', 'another treatment', 
      'the last one'] 

ax.set_xticklabels(group_labels) 

私はまだあなたの上記の例は動作しなかった理由に取り組んでいます:

+0

をあなたは補遺ことができますあなたがラベルを取得するために使ったプロット? – Claudio

+1

上のスニペットを参照 – repoman

+0

まだキャンバスを描画していないため、空白のラベルが表示されています。ラベルを印刷する前に 'draw()'を呼び出すと、期待通りのものが得られます。個々の目盛りラベルを設定することは、残念なことにタッチが難しくなります(起こっていることは、目盛りロケータとフォーマッタがリセットされておらず、 'set_text'のときに上書きされるということです)。誰かが私にそれを打つことがない場合、少し例を追加します。私は現時点では、バスに乗る必要があります。 –

答えて

156

警告:ダニラベルが既に文字列に設定されていない限り(これは通常、ボックスプロットなどの場合のように)、1.1.0より新しいバージョンのmatplotlibでは動作しません。現在のgithubマスターから作業している場合、これは機能しません。

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet. 
fig.canvas.draw() 

labels = [item.get_text() for item in ax.get_xticklabels()] 
labels[1] = 'Testing' 

ax.set_xticklabels(labels) 

plt.show() 

:私は

通常、あなたはこれらの線に沿って何かをしたい...それは意図しない変更することができ、またはそれはないかもしれません...問題はまだあるかわからないんだけどenter image description here

なぜ多くのフープを飛び越える必要があるのか​​を理解するには、matplotlibがどのように構造化されているかをもう少し理解する必要があります。

Matplotlibは、明示的に指示されない限り、ダニなどの静的な位置付けを意図的に回避します。あなたがプロットとやりとりしたいので、プロット、ティック、ティックラベルなどの境界が動的に変化するという前提があります。

したがって、指定した目盛りラベルのテキストを設定するだけではありません。デフォルトでは、プロットが描画されるたびに軸のロケータとフォーマッタによって再設定されます。

ただし、ロケータとフォーマットが静的(それぞれFixedLocatorFixedFormatter)に設定されている場合、目盛りのラベルは同じままです。

これはset_*ticklabelsまたはax.*axis.set_ticklabelsです。

個々の目盛りラベルを変更するのがなぜちょうど複雑であるのかについて、それがはっきりと分かりやすくなることを願っています。

しばしば、特定の位置に注釈を付けるだけです。その場合は、annotateを参照してください。

+5

現在のバージョン(1.20)では動作していません。 –

+1

例のように、ティッシュラベルが既に文字列に設定されている場合。 boxplot、これはまだ動作しています。これは明らかかもしれませんが、答えの最初の行は新しいmatplotlibのバージョンでは動作していないため、ユーザーは完全にスキップすることがあります(私は最初に行いました)。たぶんこれを簡単に言及します。 –

+2

私はあなたがそれを凝縮することができると思う* plt.gca()。set_xticklabels(ラベル)* – alexey

10

軸クラスは、あなたがそうのように、目盛りラベルを設定することができますset_yticklabels機能を持っています。

+2

しかし、私は単一のラベルを変更したいだけです。上のトリックでは、すべての目盛りラベルを抽出して、希望の値を新しい値に設定する必要があります。しかし、label.get_text()が何も返さないとき、どのように目盛りのラベルを抽出できますか? – repoman

-4

あなたが行うことができます:あなたはstr値の束と目盛りラベルを設定しない場合matplotlibの新しいバージョンで

for k in ax.get_xmajorticklabels(): 
    if some-condition: 
     k.set_color(any_colour_you_like) 

draw() 
65

、彼らはデフォルト(とで''あるプロットはラベルを描画する場合単にティック値です)。

>>> from pylab import * 
>>> axes = figure().add_subplot(111) 
>>> a=axes.get_xticks().tolist() 
>>> a[1]='change' 
>>> axes.set_xticklabels(a) 
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>] 
>>> plt.show() 

と結果: enter image description here

、あなたが_xticklabelsをチェックすると、今、彼らはもはや''の集まりですあなたの所望の出力を得るために、ということを知ることは、このような何かを必要とします。

>>> [item.get_text() for item in axes.get_xticklabels()] 
['0.0', 'change', '1.0', '1.5', '2.0'] 

それは、現在のバージョン2.01.1.1rc1からのバージョンで動作します。

+0

ありがとう、これは私が探していた答えです。最もクリーンなソリューションIMO;文字列とティックオブジェクトの混合リストを 'set_xticklabels'に与えてください。 –

+0

目盛りのラベルがint型に設定されている場合、目盛りのラベルが浮動小数点型に変更されることに注意してください。簡単に回避したが、注目に値する。 – ApproachingDarknessFish

56

一つもpylabxticks

import pylab as plt 
x = [0,1,2] 
y = [90,40,65] 
labels = ['high', 'low', 37337] 
plt.plot(x,y, 'r') 
plt.xticks(x, labels, rotation='vertical') 
plt.show() 

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html

+0

これは簡単な解決策でpyplot 1.5.1で動作します。これはupvotedする必要があります。 – wordsmith

+0

この質問では質問しませんでしたが、この例ではラベルの変更と同時に目盛りの位置を設定できることを感謝します。 – eclark

1

でこれを行うことができます。これは動作します:

import matplotlib.pyplot as plt 

fig, ax1 = plt.subplots(1,1) 

x1 = [0,1,2,3] 
squad = ['Fultz','Embiid','Dario','Simmons'] 

ax1.set_xticks(x1) 
ax1.set_xticklabels(squad, minor=False, rotation=45) 

FEDS

関連する問題