HOWTO · Matplotlib

在 Matplotlib 中設定 X 軸刻度值

本教程介紹瞭如何使用 Matplotlib 中的 matplotlib.pyplot.xticks()來設定 X 軸的刻度值。

本頁內容

使用 matplotlib.pyplot.xticks() 設定 X 軸刻度線的位置,也可以選擇指定各位置要顯示的文字。刻度位置代表水平座標;它們不會改變繪製的資料,也不會設定座標軸標題。為了讓圖表易讀,請讓每個標籤都對應到它所描述的位置與資料點。

設定 X 軸刻度位置與標籤

xticks() 的第一個引數是一組位置。可選的第二個引數則為每個位置提供一個標籤。兩組序列的長度與順序都必須一致。以下範例在同一張圖中展示自訂標籤、數值間距、等距索引替代方式,以及減少數量並旋轉的類別標籤。

import matplotlib.pyplot as plt

x = [1, 2, 5, 9]
y = [3, 5, 4, 8]
labels = ['Jan', 'Feb', 'May', 'Sep']
categories = ['North region', 'South region', 'East region', 'West region', 'Central region']
values = [12, 9, 14, 7, 11]

fig, axes = plt.subplots(2, 2, figsize=(10, 7))

axes[0, 0].plot(x, y, marker='o')
axes[0, 0].set_title('Custom labels')
axes[0, 0].set_xlabel('Month')
axes[0, 0].set_ylabel('Value')
plt.sca(axes[0, 0])
plt.xticks(x, labels)

axes[0, 1].plot(x, y, marker='o')
axes[0, 1].set_title('Numeric spacing')
axes[0, 1].set_xlabel('X value')
axes[0, 1].set_ylabel('Value')

index_positions = list(range(len(x)))
axes[1, 0].plot(index_positions, y, marker='o')
axes[1, 0].set_title('Evenly spaced positions')
axes[1, 0].set_xlabel('Month')
axes[1, 0].set_ylabel('Value')
axes[1, 0].set_xticks(index_positions)
axes[1, 0].set_xticklabels(labels)

axes[1, 1].bar(categories, values)
axes[1, 1].set_title('Fewer, rotated category labels')
axes[1, 1].set_ylabel('Value')
axes[1, 1].set_xticks([0, 2, 4])
axes[1, 1].set_xticklabels(categories[::2])
plt.sca(axes[1, 1])
plt.xticks(rotation=35, ha='right')

fig.tight_layout()
plt.show()

左上圖將四個位置分別配上四個月份標籤;範例中顯示的標籤維持英文。數值圖使用實際的 x 值,因此 2 到 5 之間的距離比 1 到 2 之間更寬。左下圖則改用 0 到 3 的位置,讓月份以相同的視覺間距排列,同時維持每個值與月份的配對。最後一張圖放置五個長條,但只在位置 0、2 和 4 顯示標籤,以減少擁擠,並將這些標籤旋轉後靠右對齊。請在已安裝 Matplotlib 的 Python 環境中執行此程式;此處未提供擷取的輸出。

處理間距不均的 X 值

數值軸呈現的是數值距離。若測量值的 x 座標為 1、2、5 和 9,依這些數值繪圖時,2 到 5 以及 5 到 9 之間的間距較大,正確反映了數值差異。將刻度標籤設為月份並不會改變這些座標。當距離或經過的時間具有意義時,請保留這種間距。

若要以相等間隔比較各類別,可使用 range(len(x)) 等索引位置繪製 y 值,再將類別名稱設為刻度標籤。資料序列與標籤必須依相同順序排列。這會把水平尺度從數值距離改為類別順序;若數值測量之間的間隔具有意義,就不適合使用此方式。

若標籤代表日期,請使用日期值作為繪圖的 x 資料,並視需要格式化日期刻度;在無關的數值座標上指派月份名稱,並不會讓那些座標變成日期。

控制刻度頻率並提升標籤可讀性

對於較小的圖表,可將明確的位置傳給 xticks(),只顯示選定的刻度。例如,plt.xticks(x[::2]) 會從有序序列中每隔一個值選取一個。使用規律的數值尺度時,可透過定位器依檢視範圍選擇合適的間隔。例如,從 matplotlib.ticker 匯入 MultipleLocator,再呼叫 ax.xaxis.set_major_locator(MultipleLocator(2)),即可指定主要刻度每隔兩個單位出現。標籤代表有意義的類別時,請選擇明確的位置;數值軸則可使用定位器。

長標籤可透過 plt.xticks(rotation=35, ha='right') 旋轉;ha 用來設定水平對齊方式。若旋轉後的標籤仍然重疊,可加寬圖表或減少刻度數量。tight_layout() 可調整座標軸周圍的空間,但不會替你選擇合適的刻度。

上方範例的大多數子圖都使用各自座標軸上的 set_xticks,並在目前的座標軸上使用 xticks 自訂標籤。採用物件導向寫法時,ax.set_xticks(positions, labels) 可將操作指定給特定座標軸。使用 pyplot 時,若圖中有多個子圖,請先選取要操作的座標軸。

常見問題:設定 X 軸值

可以在一次呼叫中同時設定位置與標籤嗎? 可以。將兩組序列傳給 plt.xticks(positions, labels),或使用 ax.set_xticks(positions, labels)。每個標籤會依索引對應到相應的位置。

如何顯示較少的刻度? 提供較短的刻度位置清單,或使用定位器設定規律間隔的數值刻度。刻度頻率與繪製的資料點數量是兩回事。

X 軸可以使用文字類別嗎? 可以。你可以像長條圖那樣直接繪製類別值,也可以繪製數值索引位置,再將類別名稱設為標籤。若需要指定類別順序或等距排列,請使用後者。

標籤重疊時可以怎麼處理? 減少標籤數量、旋轉標籤、將旋轉後的文字靠右對齊,或加寬圖表。這些調整只會影響刻度標籤,不會改變繪製的數值。