プロットティックの数を減らす


160

グラフにティックが多すぎて、お互いに実行されています。

ティックの数を減らすにはどうすればよいですか?

たとえば、私には目盛りがあります:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

そして私はただ欲しい:

1E-5, 1E-3, ... 1E5, 1E7

私はで遊んでみましたが、LogLocatorこれを理解することができませんでした。

回答:


266

または、matplotlibがティックを配置できるようにしながら(現在はでのみMaxNLocator)ティック数を単純に設定したい場合はpyplot.locator_params

pyplot.locator_params(nbins=4)

以下で説明するように、このメソッドで特定の軸を指定できます。デフォルトは両方です。

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
これは素晴らしい提案でした。また、指定するpyplot.locator_params(axis = 'x', nbins = 4)(またはaxis = 'y')ことができるため、プロセスが非常に簡単になりました。@bgamariに感謝!
benjaminmgross

8
ログスケールでは、これは次のnumticks代わりに機能しましたnbins
meduz

1
@ bgamari、@ meduz numticksによって指摘された対数プロットのソリューションを追加していただけませんか?
ロイテン2017年

7
これはラベルを本来あるべき場所に配置しないようです。オリジナルの目盛りラベルがある場合たとえば、[0, 1, ..., 99]今1セットnticks=10、そして新しいスパースラベルが長く離れて軸に沿って10回を置くことになる、すなわち、今1どこに座って9、だった2ところ19だった...と9場所99でした。
Vim

2
この方法を信頼する前に結果を確認してください。@Vimは正しいです。ティック値は正しく配置されません。
デビッドJ.

53

それでも誰かがこのページを検索結果に表示する場合:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
これは実際には何もしなかった他のすべての回答に対して機能しました。感謝:)
ファイザン

よくやった。これを見つけるのに少し時間がかかりましたが、私が望んでいたことを行いました。
ジョン

ありがとうございます。これにより、残っているラベルが正しい位置に配置されます。この回答を改善する追加の手順は、目盛りも削除することです。
デビッドJ.

非常にシンプルな答え-SOコミュニティに知られているカスタムメソッドがないことに驚いた。これはlibへの貴重な追加でしょうか?
jabberwocky

32

目盛りのカスタマイズと外観の問題を解決するには、matplotlib Webサイトの目盛りロケーターガイドを参照してください

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

x軸の目盛りの総数を3に設定し、それを軸全体に均等に分散します。

これについての素晴らしいチュートリアルもあります


最初の3つの日時インデックスのみを選択します。pandas.DataFrame.plotから斧を取得するとき ax = df.plot()
Mithril

@ミスリル申し訳ありませんが、あなたのコメントはよくわかりません。詳しく説明してもらえますか?
Prageeth Jayathissa

pandas.DataFrame日時インデックス[2019-01-01、... 2019-11-01]のdf()がある場合、を呼び出して ax = df.plot()、Figureオブジェクトを返します。ax.xaxis.set_major_locator(plt.MaxNLocator(3)) 最初の3つのインデックスのみを呼び出す[2019-01-01、2019-01-02、2019-01-03]。
Mithril、

1
@ミスリルはdf.plot()しばしばを表示するminor_locatorので、試してみてくださいax1.xaxis.set_minor_locator(plt.MaxNLocator(3))。また3、表示する目盛りの数をに置き換えてください。パンダimport matplotlib.dates as mdatesax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))ax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
タイムシリーズの場合

20

set_ticks()軸オブジェクトの関数があります。


4
これは、必要なティックを事前に知っていれば機能します。上記の例はほんの一例です。ティックが何であるかはわかりませんが、ティックを1つおきに減らしたいと思っています。
jlconlin

10
get_xticks()またはget_yticks()最初に軸オブジェクトを呼び出し、必要に応じて編集してから、リストをに返すことができset_ticks()ます。
user812786 2011

4
私は持っていませんがset_ticks()、私は持っset_xticks()ていset_yticks()ます。これらは軸ではなく、軸オブジェクトの属性です。たぶん、ここ数年でこれが変わったのでしょう。
Gauthier 2013年

2
どうすればよいかわかりませんが、あなたの答えがそのまま役立つ人もいますし、私にとってそれが違うからといって、それがすべての人に役立つというわけではありません。
Gauthier 2013年

1
例を挙げれば、この回答が役立つようになるでしょう。
Richard

10

誰かがまだそれを必要としている場合、ここでは実際には何も機能しなかったので、ティック数を正確にNに固定しながら、生成されたプロットの外観を「そのまま」保持する非常に簡単な方法を考え出しました。

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
私はそれがintの代わりに、floatとして値を返すために取得するために、わずかに最後の行を変更する必要がありました:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
ニックSettje

@NickSettjeはまだ私と一緒に浮かんでいます!
Mohd

4

@raphaelが与えた解決策は簡単で非常に役に立ちます。

それでも、表示される目盛りラベルは、元の分布からサンプリングされた値ではなく、によって返された配列のインデックスからサンプリングされた値になりますnp.linspace(ymin, ymax, N)

元の目盛りラベルから等間隔にN値を表示するには、set_yticklabels()メソッドを使用します。以下は、整数ラベルのあるy軸のスニペットです。

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

この素敵な調整のための称賛!
Mohd

2

対数スケールが使用されている場合、主目盛りの数は次のコマンドで修正できます

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

に設定されるnumticks値は、表示される軸目盛りの数を決定します。

locator_params()関数を紹介した@bgamariの投稿のクレジットですがnticks、ログスケールが使用されている場合、パラメーターはエラーをスローします。


質問と回答は、前回のmatplotlibのために、すなわち1であり、あなたは2を参照している
Dawid Laszuk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.