Python がデータをプロットする方法を修正しようとしています。
言う
x = [0,5,9,10,15]
と
y = [0,1,2,3,4]
それから私はするだろう:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
x 軸の目盛りは 5 の間隔でプロットされます。1 の間隔を表示する方法はありますか?
Python がデータをプロットする方法を修正しようとしています。
言う
x = [0,5,9,10,15]
と
y = [0,1,2,3,4]
それから私はするだろう:
matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()
x 軸の目盛りは 5 の間隔でプロットされます。1 の間隔を表示する方法はありますか?
目盛りを付けたい場所を明示的に設定できます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()
(念のためPythonの関数でnp.arange
はなく使用され、intではなくfloatです。)range
min(x)
max(x)
(plt.plot
または) 関数は、デフォルトと制限ax.plot
を自動的に設定します。これらの制限を維持し、目盛りのステップサイズを変更するだけの場合は、Matplotlib が既に設定している制限を検出するために使用できます。x
y
ax.get_xlim()
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()
私はこのソリューションが好きです(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()
、自動制限決定を可能にし、後で簡単に読み取ることができます。
これは古いトピックですが、私は時々これに出くわし、この機能を作成しました。とても便利です:
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 関数を再度実行します。
私は洗練されていないソリューションを開発しました。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()
上記のソリューションはどれNone
も私のユースケースでは機能しなかったため、ここでは、さまざまなシナリオに適応できる (駄洒落!) を使用したソリューションを提供します。
X
以下は、とY
軸の両方で雑然とした目盛りを生成するサンプル コードです。
# Note the super cluttered ticks on both X and Y axis.
# inputs
x = np.arange(1, 101)
y = x * np.log(x)
fig = plt.figure() # create figure
ax = fig.add_subplot(111)
ax.plot(x, y)
ax.set_xticks(x) # set xtick values
ax.set_yticks(y) # set ytick values
plt.show()
ここで、x 軸と y 軸の両方でまばらな値のセットのみを目盛りとして表示する新しいプロットで混乱を解消します。
# inputs
x = np.arange(1, 101)
y = x * np.log(x)
fig = plt.figure() # create figure
ax = fig.add_subplot(111)
ax.plot(x, y)
ax.set_xticks(x)
ax.set_yticks(y)
# which values need to be shown?
# here, we show every third value from `x` and `y`
show_every = 3
sparse_xticks = [None] * x.shape[0]
sparse_xticks[::show_every] = x[::show_every]
sparse_yticks = [None] * y.shape[0]
sparse_yticks[::show_every] = y[::show_every]
ax.set_xticklabels(sparse_xticks, fontsize=6) # set sparse xtick values
ax.set_yticklabels(sparse_yticks, fontsize=6) # set sparse ytick values
plt.show()
ユースケースに応じて、show_every
X または Y または両方の軸の目盛り値をサンプリングするためにそれを変更して使用するだけで、上記のコードを適応させることができます。
このステップサイズ ベースのソリューションが適合しない場合、必要に応じてsparse_xticks
またはの値をsparse_yticks
不規則な間隔で入力することもできます。