matplotlibのxまたはy軸の「ティック周波数」を変更しますか?


477

Pythonがデータをプロットする方法を修正しようとしています。

いう

x = [0,5,9,10,15]

そして

y = [0,1,2,3,4]

それから私はやります:

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

x軸の目盛りは5の間隔でプロットされます。間隔を1に表示する方法はありますか?


6
ここではティックが適切な単語ですが、ティックをステップサイズに変更すると、この質問の初心者には間違いなくガイドになります。
Sibbsギャンブル2013

9
密接に関連した質問:stackoverflow.com/questions/6682784/…と優れた解決策:pyplot.locator_params(nbins=4)
Jan-Philip Gehrcke博士2014

nbinsは残念ながらmatplotlib2.xで非推奨になっているようです
jeremy_rutman

回答:


583

目盛りを付けたい場所を明示的に設定することができますplt.xticks

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

例えば、

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

np.arangePythonのではなく、使用したrangeだけの場合に機能min(x)し、max(x)あるはintの代わりに浮かびます。)


plt.plot(またはax.plot)関数は、自動的にデフォルトを設定しますxy限界を。これらの制限を維持し、目盛りの刻み幅を変更するだけの場合は、ax.get_xlim()Matplotlibがすでに設定している制限を見つけるために使用できます。

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

デフォルトのティックフォーマッタは、ティック値を有効な有効桁数に丸める適切なジョブを実行する必要があります。ただし、フォーマットをさらに制御したい場合は、独自のフォーマッターを定義できます。例えば、

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

これは実行可能な例です:

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

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()

72
それ自身の制限を決定する方法はありませんが、ステップサイズを変更するだけですか?この方法は、分が3523.232512のようなものである場合、あまり良くありません。
Korone、2013年

3
@Corone、あなたから質問されて久しぶりですが、自動境界決定を使用しながらステップサイズを簡単に制御できる回答を以下に投稿しました。
jthomas

3
最後の目盛りを表示する+1plt.xticks(np.arange(min(x), max(x)+1, 1.0))はin が必要であることに注意してください。
アレックスウィリソン2017年

1
はい、np.arange(start, stop)中の値を生成半開区間[start, stop)を含め、startしかし除きますstop。だから私はmax(x)+1それmax(x)が含まれていることを確認するために使用しました。
unutbu

4
たとえば、datetimeに相当するものはあり plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)ますか?それは年のみをプロットしているようです
WBM '10

207

別のアプローチは、軸ロケーターを設定することです:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

ニーズに応じて、いくつかの異なるタイプのロケーターがあります。

ここに完全な例があります:

import matplotlib.pyplot as plt
import matplotlib.ticker as plticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

7
これは期待どおりに機能しません。具体的には、日付を使用する場合、適切な日付を使用しません。
Chris Fonnesbeck、2014

35
日付を使用するときは、matplotlib.datesモジュールのメソッドを使用する必要があります。例matplotlib.dates.AutoDateLocator()
robochat 2014年

3
それは日付で、私にとっては期待通りに機能しました。このソリューションは、受け入れられているソリューションよりもはるかに簡単です。
Pablo Suau 16

何をするんbase=1.0実際に行う/意味ですか?
javadba

base = 1.0は、整数ごとにロケーターが存在することを意味します。ドキュメントには、MultipleLocatorが「表示間隔内の基数の整数の各整数に目盛りを設定する」と記載されています。したがって、base = 2の場合、偶数の目盛りがあり、base = 2.5をイベントに配置できると思います。
robochat

124

私はこの解決策が好きです(Matplotlib Plotting Cookbookから):

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

このソリューションは、に与えられた数によって目盛り間隔を明示的に制御しticker.MultipleLocater()、自動制限決定を可能にし、後で簡単に読み取ることができます。


3
ティックを明示的に計算せずにこれを行う方法!
Zelphir Kaltstahl 2016

4
これは、同じ答えである、この1。2年後に同じ答えを追加しても意味がありません。
ImportanceOfBeingErnest

6
良いキャッチ。答えを投稿したとき、私はそれらを同じものとして認識しませんでした。それでも、このプレゼンテーションは少しわかりやすいと思います。
jthomas 2017年

この回答の参考文献には、詳細な情報源も含まれています。
Steven C. Howell

1
これは、3年前に来たロボチャットと同じ答えです。
MERose、

90

誰かが一般的なワンライナーに興味がある場合は、現在のティックを取得し、それを使用して、他のすべてのティックをサンプリングして新しいティックを設定します。

ax.set_xticks(ax.get_xticks()[::2])

3
これは、さまざまなティックタイプ(str、float、datetime)に対する唯一の一般化可能な回答です
Ryszard Cetnarski '20 / 09/20

2
整数以外のティックを削除: ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
user2839288

上記の詳細な解決策はたくさんありますが、これが最も簡潔であることに同意します。ax.get_xticks()の長さを抽出して、この長さを必要なティック数で割った値でスライス頻度を設定することもできます。
Iain D

これが最良の答えだと思います。他のほとんどの回答は複雑すぎて、適用/一般化するのが困難です。ありがとうございました!
Seankala

2
それはスティックの数を減らすことしかできませんが、質問(そして私がどのようにそれを見つけたかという私の目標は)を増やすことでした。
Alexei Martianov

36

これは少しハックですが、私がこれを行うことがわかった例をはるかにクリーン/最も簡単に理解する例です。それはここのSOの答えからです:

matplotlibカラーバーのn番目の目盛りラベルをすべて隠す最もクリーンな方法は?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

次に、必要な密度に応じて、ラベルをループして表示または非表示に設定できます。

編集:時にはmatplotlibがラベル==を設定することに注意してください ''ため、実際にはラベルが存在し、何も表示されていない場合でも、ラベルが存在しないように見える。実際に表示されているラベルをループしていることを確認するには、次のことを試してください。

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

3
これは最もシンプルで汎用的なソリューションです。小さな調整:通常ax.get_xticklabels()[1::2]は非表示にするラベルです。
jolvi 2015

これはmatplotlib.finance.candlestick2では機能しません
BCR

@BCRいくつかのxticklabelsが単に設定される''ため、それらをループするときに、空のxticklabelsを非表示にします(これは視覚化には影響しませんが、プルしているわけではない可能性があります)正しいラベル)。あなたは試みることができる: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
choldgraf

15

これは古い話題ですが、ときどきつまづいてこの機能を作りました。とても便利です:

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

このようにティックを制御する際の注意点の1つは、追加された行の後で、最大スケールのインタラクティブな自動マジック更新を享受できないことです。それから

gca().set_ylim(top=new_top) # for example

そして、再度resadjust関数を実行します。


11

洗練されていないソリューションを開発しました。X軸と、Xの各ポイントのラベルのリストがあることを考慮してください。

例:
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
「feb」と「jun」のみの目盛りラベルを表示するとします。
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
これで、ラベルの偽のリストができました。最初に、元のバージョンをプロットしました。
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
今、修正版です。
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

6

最小限のボイラープレートでシンプルな1ライナーの間隔を設定したい場合:

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

マイナーティックに対しても簡単に機能します。

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

少し口いっぱいですが、かなりコンパクトです


2
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

これは私のために働いた

[1,5](1と5を含む)の間のティックが必要な場合は、

length = 5

1
ファイ、あなたは単に書くことができますxmarks = range(1, length+1, 1)。リストの理解が冗長であることを確認してください。
ニール、2017

2

純粋なPythonの実装

以下は、正、負、または混合の値を持つ任意の数値系列(intまたはfloat)を処理し、ユーザーが必要なステップサイズを指定できる、必要な機能の純粋なpython実装です。

import math

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    xMax, xMin = math.ceil(max(x)), math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

出力例

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

使用例

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()

サンプル使用量のプロット

x軸の整数値はすべて5の等間隔になっていますが、y軸の間隔は異なります(matplotlib目盛りが指定されていないため、デフォルトの動作です)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.