目盛りラベルのテキストを変更する


215

プロットで選択したいくつかの目盛りラベルにいくつかの変更を加えたいです。

たとえば、私が行う場合:

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」というラベルが付いた目盛りが含まれます。


ラベルを取得するために使用したプロットを提供できますか?
クラウディオ

キャンバスをまだ描画していないため、空白のラベルが表示されます。draw()ラベルを印刷する前に電話をかけると、期待どおりの結果が得られます。個々の目盛りラベルを設定することは、残念ながら少し難しいです(何が起こっているのかは、目盛りロケーターとフォーマッターがリセットされておらず、をオーバーライドした場合ですset_text)。誰かが私に打ち負かされない場合は、少し例を追加します。でも、今はバスに乗らなければなりません。
Joe Kington

@JoeKington:すばらしい!あなたの修正を見て楽しみにしています。
repoman

@repoman-さて、私は少し早めに話をしたようです。私が考えていたものは、古いバージョンのmatplotlibで機能しますが、最新バージョンでは機能しません。もう少し掘り下げる必要があります。そうは言っても、これはそれほど複雑ではないはずです...
Joe Kington

回答:


298

警告:目盛りラベルが既に文字列に設定されていない限り(たとえば、ボックスプロットの場合のように)、これは、より新しいバージョンのmatplotlibでは機能しません1.1.0。現在の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()

ここに画像の説明を入力してください

非常に多くのフープをジャンプする必要がある理由を理解するには、matplotlibの構造についてもう少し理解する必要があります。

Matplotlibは、明示的に指示されない限り、意図的にティックなどの「静的な」配置を回避します。想定は、プロットを操作する必要があるため、プロットの境界、目盛り、目盛りラベルなどが動的に変化することです。

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

ロケータとフォーマッタが(静的に設定されている場合は、FixedLocatorおよびFixedFormatterそれぞれを、)、その後、目盛りラベルが同じまま。

これは、何をするset_*ticklabelsax.*axis.set_ticklabelsです。

うまくいけば、個々の目盛りラベルの変更が少し複雑になる理由が少し明らかになります。

多くの場合、実際にやりたいことは、特定の位置に注釈を付けることだけです。その場合はannotate、代わりにを調べてください。


10
これは現在のバージョン(1.20)では動作しないようです。
Andrew Jaffe 2013年

1
目盛りラベルが箱ひげ図などのようにすでに文字列に設定されている場合、これはまだ機能しています。これは明白かもしれませんが、答えの最初の行はそれが新しいmatplotlibバージョンで動作していないということなので、ユーザーはそれを完全にスキップするかもしれません(私は最初に行いました)。これについて簡単に触れましょう。
joelostblom 14

2
私はそれをplt.gca()。set_xticklabels(labels)
alexey 2017

「テスト」のboldフォントの太さを他のユーザーが「ライト」のフォントの太さで使用したい場合 それを行う方法はありますか?
スティーブン

1
jupyterノートブックでこれを使用する人にとっては、それfig.canvas.draw()が重要であることに注意することの恩恵を受けるかもしれません
wander95

95

pylabxticksでもこれを行うことができます

import matplotlib
import matplotlib.pyplot 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


これはシンプルなソリューションであり、pyplot 1.5.1で動作します。これは賛成されるべきです。
wordsmith

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

最新のmatplotlib docsから:「名前空間の汚染のため、pylabは非推奨になり、その使用は強く推奨されていません。代わりにpyplotを使用してください。」
ナサニエルジョーンズ

93

の新しいバージョンではmatplotlib、一連のstr値で目盛りラベルを設定しない場合、それらは''デフォルトです(そして、プロットが描画されるとき、ラベルは単に目盛り値です)。それを知って、あなたの望ましい出力を得るためには、このようなものが必要になるでしょう:

>>> 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()

そして結果: ここに画像の説明を入力してください

そして今、あなたがをチェックすると_xticklabels、それらはもはや束ではありません''

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

から1.1.1rc1までのバージョンで動作します2.0


ありがとう、これが私が探していた答えです。最もクリーンなソリューションIMO; set_xticklabels文字列とティックオブジェクトの混合リストを指定するだけです。
ルークデイビス

目盛りラベルがintとして設定されている場合、これにより浮動小数点に変更されることに注意してください。簡単に回避できますが、注目に値します。
へのアプローチ

これは機能しました(ax.get_xticks().tolist())。最も投票されたソリューションはそうしませんでした(ax.get_xtickslabels())。提案plt.show()fig.canvas.draw()れたとおりに使用しましたが、実行前にラベルが抽出できませんでした。
CypherX

FYI、最新のmatplotlibドキュメントから:「pylabは非推奨であり、名前空間の汚染のため、その使用は強く推奨されていません。代わりにpyplotを使用してください。」
ナサニエルジョーンズ

17

この質問が出されて久しぶりです。今日(matplotlib 2.2.2)といくつかの読書と試行の後、私は最良の/適切な方法は次のとおりだと思います:

Matplotlibには、「完全に構成可能な目盛りの位置とフォーマットをサポートするクラスが含まtickerているという名前のモジュールがあります。プロットから特定のティックを変更するには、次のようにしてください:

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

def update_ticks(x, pos):
    if x == 0:
        return 'Mean'
    elif pos == 6:
        return 'pos is 6'
    else:
        return x

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()

正規分布からのランダムな値を持つヒストグラム

警告! x目盛りの値でありpos、軸内の順序での相対位置です。pos10インデックスを作成するときに、通常どおりではなく、で始まる値を取ります。


私の場合、y-axisヒストグラムのパーセンテージ値をフォーマットしようとしました。以前のように別の関数を定義する必要なしにこれを簡単に行うことができるmtickerという名前の別のクラスPercentFormatterがあります:

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()

正規分布からのランダムな値を持つヒストグラム

この場合xmaxは、100%に対応するデータ値です。パーセンテージはとして計算されるためx / xmax * 100、修正しますxmax=1.0。また、decimalsポイントの後に配置する小数点以下の桁数です。


12

Axesクラスには、次のように目盛りラベルを設定できるset_yticklabels関数があります。

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

ax.set_xticklabels(group_labels)

上記の例が機能しなかった理由については、まだ調査中です。


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

11

これは機能します:

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


7

これはmatplotlib 3でも機能します。

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

plt.xticks(x1, squad, rotation=45)

5

あなたが動作しない場合figax、あなたはすべてのラベルを変更したい(例えば正規化のために)あなたはこれを行うことができます。

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))

1

これを試して :

  fig,axis = plt.subplots(nrows=1,ncols=1,figsize=(13,6),sharex=True)
  axis.set_xticklabels(['0', 'testing', '10000', '20000', '30000'],fontsize=22)

-4

できるよ:

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

draw()

なぜこの回答が非常に反対投票されているのか誰かが説明できますか?
HlynurDavíðHlynsson

@HlynurDavíðHlynsson質問とは関係ありません。ええと、多分編集して…質問に関連するようになったら編集してください。;)
loved.by.Jesus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.