web-dev-qa-db-ja.com

Matplotlibのx軸またはy軸の「目盛りの頻度」を変更する

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

いう

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

そして

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

それから私はするだろう:

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

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

341
Dax Feliz

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

min(x)max(x)がintではなくfloatである場合に備えて、Pythonのrange関数ではなくnp.arangeが使用されました。)


plt.plot(またはax.plot)関数は自動的にデフォルトのxおよびy制限を設定します。これらの制限を維持し、目盛りのステップサイズを変更するだけの場合は、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()
431
unutbu

もう1つの方法は、軸ロケーターを設定することです。

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

私はこの解決法が好きです( 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()に与えられた数を介して目盛りの間隔の明示的な制御をあなたに与え、自動限界決定を可能にし、そして後で読むのは簡単です。

90
jthomas

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

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

これは少し厄介です、しかし私がこれをするのを発見したということをはるかに最もクリーンで/理解しやすい例です。これは、ここのSOの回答からです。

matplotlibカラーバーのn番目の目盛ラベルをすべて隠す最もきれいな方法は?

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

その後、ラベルをループして、希望する密度に応じてラベルを表示または非表示に設定できます。

edit:matplotlibはlabels == ''を設定することがあるので、実際にはラベルが存在せず、何も表示されていないときにラベルが存在しないように見えることがあります。実際の表示ラベルをループしていることを確認するには、次のようにします。

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)
27
choldgraf

これは古い話題ですが、私は時々この問題についてつまずいてこの機能を作りました。とても便利です。

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

そして再調整機能を再度実行してください。

13
Tompa

私は洗練されていない解決策を開発しました。 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']
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()
8
Deninhos
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

これは私のために働きました

[1,5](1と5を含む)の間の目盛りが必要な場合は、次の値を置き換えます。

length = 5
2
Piyush Gupta

これは、正、負、または混合値を持つ任意の数値系列(intまたはfloat)を処理する、目的の機能を純粋にpythonで実装したものです。

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
    """
    import math as Math
    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()
1
Greenstick