控制刻度間距
目前為止,我們讓 Matplotlib 自動處理刻度在坐标軸上的位置,但有時我們需要覆寫預設的坐标軸刻度配置,以便更加快速估計圖形中點的坐标。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = np.linspace(-20, 20, 1024)
y = np.sinc(x)
ax = plt.axes()
ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))
plt.plot(x, y, c = 'm')
plt.show()

以上代碼,強制水準刻度每隔 5 個機關步長呈現一次。此外,我們還添加了副刻度,副刻度的間隔為 1 個機關步長,步驟說明如下:
1. 首先執行個體化一個 Axes 對象——用于管理圖形中的坐标軸:ax=plot.Axes()。
2. 然後使用 Locator 執行個體設定 x 軸 (ax.xaxis) 或 y 軸 (ax.yaxis) 的主刻度和副刻度。
也為副刻度添加輔助網格:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = np.linspace(-20, 20, 1024)
y = np.sinc(x)
ax = plt.axes()
ax.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))
plt.grid(True, which='both', ls='dashed')
plt.plot(x, y, c = 'm')
plt.show()
Tips:我們已經知道,可以使用 plt.grid() 添加輔助網格,但此函數還有一個可選參數 which,它具有三個可選值:"minor"、"major" 和 "both",分别用于僅顯示副刻度、僅顯示主刻度、主副刻度同時顯示。
控制刻度标簽
是時候介紹刻度标簽的設定了,刻度标簽是圖形空間中的坐标,雖然數字刻度标簽對于大多說場景來說是足夠的,但是卻并不總是能夠滿足需求。例如,我們需要顯示 100 個公司的營收情況,這時候我們就需要橫坐标刻度标簽為公司名,而非數字;同樣對于時間序列,我們希望橫坐标刻度标簽為日期。考慮到此類需求,我們需要使用 Matplotlib 為此提供了的 API 控制刻度标簽。
可以按以下步驟為任何 Matplotlib 圖形設定刻度标簽:
import numpy as np
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
name_list = ('Apple', 'Orange', 'Banana', 'Pear', 'Mango')
value_list = np.random.randint(0, 99, size = len(name_list))
pos_list = np.arange(len(name_list))
ax = plt.axes()
ax.xaxis.set_major_locator(ticker.FixedLocator((pos_list)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter((name_list)))
plt.bar(pos_list, value_list, color = 'c', align = 'center')
plt.show()
Tips:我們首先使用 ticker.Locator 執行個體來生成刻度的位置,然後使用 ticker.Formatter 執行個體将為刻度生成标簽。FixedFormatter 從字元串清單中擷取标簽,然後用 Formatter 執行個體設定坐标軸。同時,我們還使用了 FixedLocator 來確定每個标簽中心都正好與刻度中間對齊。
更簡單的設定方式
雖然使用上述方法可以控制刻度标簽,但可以看出此方法過于複雜,如果刻度标簽是固定的字元清單,那麼可以用以下簡單的設定方法:
import numpy as np
import matplotlib.pyplot as plt
name_list = ('Apple', 'Orange', 'Banana', 'Pear', 'Mango')
value_list = np.random.randint(0, 99, size = len(name_list))
pos_list = np.arange(len(name_list))
plt.bar(pos_list, value_list, color = 'c', align = 'center')
plt.xticks(pos_list, name_list)
plt.show()
Tips:使用 plt.xticks() 函數為一組固定的刻度提供固定标簽,此函數接受位置清單和名稱清單作為參數值,可以看出,此方法比第一種方法實作起來更簡單。
進階刻度标簽控制
不僅可以使用固定标簽,使用 ticker API 可以使用函數生成的标簽:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
def make_label(value, pos):
return '%0.1f%%' % (100. * value)
ax = plt.axes()
ax.xaxis.set_major_formatter(ticker.FuncFormatter(make_label))
x = np.linspace(0, 1, 256)
plt.plot(x, np.exp(-10 * x), c ='c')
plt.plot(x, np.exp(-5 * x), c= 'c', ls = '--')
plt.show()
Tips:在此示例中,刻度标簽是由自定義函數 make_label 生成的。此函數以刻度的坐标作為輸入,并傳回一個字元串作為坐标标簽,這比給出固定的字元串清單更靈活。為了使用自定義函數,需要使用 FuncFormatter 執行個體——一個以函數為參數的格式化執行個體。
這種将生成标簽的實際任務指派給其他函數的方法稱為委托(delegation)模式,這是一種漂亮的程式設計技術。比方說,我們要将每個刻度顯示為日期,這可以使用标準的 Python 時間和日期函數完成:
import numpy as np
import datetime
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
start_date = datetime.datetime(1998, 1, 1)
def make_label(value, pos):
time = start_date + datetime.timedelta(days = 365 * value)
return time.strftime('%b %y')
ax = plt.axes()
ax.xaxis.set_major_formatter(ticker.FuncFormatter(make_label))
x = np.linspace(0, 1, 256)
plt.plot(x, np.exp(-10 * x), c ='c')
plt.plot(x, np.exp(-5 * x), c= 'c', ls = '--')
labels = ax.get_xticklabels()
plt.setp(labels, rotation = 30.)
plt.show()
Tips:可以利用 ax.get_xticklabels() 擷取刻度标簽執行個體,然後對标簽進行旋轉,以避免長标簽之間重疊,旋轉使用 plt.setp() 函數,其接受刻度标簽執行個體和旋轉角度作為參數值。