Matplotlib中的titles(標題)、labels(標簽)和legends(圖例)
Matplotlib是一個Python中常用的繪圖庫,用于創建各種類型的圖表。在Matplotlib中,你可以使用titles(標題)、labels(標簽)和legends(圖例)來增強你的圖表。本文討論Python的Matplotlib繪圖庫中可用的不同標記選項。
Figure, subplots 和axes列表
在Matplotlib中,Figure是整個圖形窗口,它可以包含一個或多個子圖(Axes)。Axes是實際繪圖區域,而Figure則是包含所有Axes、標題、標簽等元素的容器。
在使用可以使用Matplotlib時可以使用plt.subplots()命令一次創建多個子圖的占位符,輸入參數nrows和ncols定義要返回的行和列的數量。返回數組包含ncols=2個元素的nrows=2個列表。每個元素都引用一個子圖。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(
nrows=2, ncols=2, figsize=(10, 7), sharex=True, sharey=True
)
# Fig = Figure object,
# axs = list of axes
# axs = [[ax1, ax2],
# [ax3, ax4]]
axes和labels
axis指的是子圖,通常稱為ax的軸對象中的x軸和y軸的一個組合。我們使用列表推導遍歷所有軸,并使用ax.set_xlabel("whatever")為每個子圖分配xlabel和ylabel。可以通過調用ax2 = ax.twinx()來創建另一個y軸;ax2.set_ylabel(“Second y-axis”);但這會使繪制圖例等事情變得復雜,因為現在繪圖配置在同一子圖中被分成兩個容器,所以我們一般都會將一個x軸和y軸放在一個子圖中,也就是我們上面說的一個組合。
i = 1
for ax in [item for sublist in axs for item in sublist]:
ax.set_xlabel(f"xlabel {i}")
ax.set_ylabel(f"ylabel {i}")
i+=1
Titles
每個子圖最多可以有三個標題Titles 。默認情況下,子圖標題顯示在子圖的上方。使用loc參數可以將唯一的標題與子圖的左邊緣或右邊緣對齊,也可以向子圖添加其他標題。有時將主標題左對齊并添加更多信息(如數據源)可能會很有用,或者使用不同的字體或較小的字體右對齊。
ax.set_title(f"Title {i} left", loc="left", fnotallow=8)
ax.set_title(f"Title {i} right", loc="right", fnotallow=10)
ax.set_title(f"Title {i} center", loc="center", fnotallow=14)
在Matplotlib中,set_title和set_ylabel等函數可以將字體、字體大小和字體粗細作為參數或作為一個名為fontdict的字典。
ax.set_title(f"Title {i} left", loc="left", fnotallow=dict(
size=8,
family="Times New Roman",
weight="bold")
)
圖的Title 和label
圖標題在Matplotlib中稱為suptitle。默認情況下,它是一個標題,在最上面的子標題中間對齊,字體大小比普通的子標題大。
與軸標簽類似,y軸和x軸也有替代標簽。默認情況下,Supylabel以居中對齊的方式出現在圖的左側,而supxlabel以居中對齊的方式出現在圖的底部。
可以自定義圖形標簽和標題的位置,方法是使用x和y參數,ha用于水平對齊,va用于垂直對齊。x和y所指向的圖坐標是從圖的左下角開始的0到1之間的數字。suptitle的默認值是x=0.5和y=0.98,這使得它位于頂部和中間。
fig.suptitle("Suptitle", fnotallow=20)
fig.supylabel("Supylabel", fnotallow=16)
fig.supxlabel("Supxlabel", fnotallow=16)
子的圖例legends
圖例是子圖中的輔助框,它告訴我們哪些數據點屬于哪個邏輯組。當在單個子圖中有多條線、多組標記等時,它們尤其有用。當調用ax.legend()時,每個沒有以下劃線開頭的標簽且包含在軸對象中的藝術家都會生成一個軸圖例條目。像ax.scatter()和ax.plot()這樣的繪圖函數將label作為參數,默認情況下,這是創建圖例時使用的標簽。
ax.scatter(
np.random.random(30) * 0.45 + 0.3,
np.random.random(30) * 0.45 + 0.3,
label="label for data",
alpha=0.3,
)
ax.legend(title=f"Legend {i} title", fnotallow=8)
如果子圖包含多個軸,例如當調用ax.twinx()時,需要在繪制圖例之前收集對藝術家的引用并將它們組合起來,以避免在同一子圖中繪制兩個圖例。
lines_ax = ax.get_lines()
lines_ax2 = ax2.get_lines()
lines = lines_ax + lines_ax2
labels = [line.get_label() for line in lines]
ax.legend(lines, labels, title=f"Legend {i} title", fnotallow=8)
總結
通過上面的介紹,我們應該對這幾個術語有了一定了解,那么我們來看看下面的代碼
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(
nrows=2, ncols=2, figsize=(10, 7),
sharex=True, sharey=True, squeeze=True
)
i = 1
for ax in [item for sublist in axs for item in sublist]:
ax.set_xlabel(f"xlabel {i}")
ax.scatter(
np.random.random(30) * 0.45 + 0.3,
np.random.random(30) * 0.45 + 0.3,
label="label for data",
alpha=0.3,
)
ax.legend(title=f"Legend {i} title", fnotallow=8)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_title(f"Title {i} left", loc="left", fnotallow=8)
ax.set_title(f"Title {i} right", loc="right", fnotallow=10)
ax.set_title(f"Title {i} center", loc="center", fnotallow=14)
ax.tick_params(labelleft=False, labelbottom=False)
ax.set_ylabel(f"ylabel {i}")
i += 1
fig.suptitle("Suptitle", fnotallow=20)
fig.supylabel("Supylabel", fnotallow=16)
fig.supxlabel("Supxlabel", fnotallow=16)
plt.tight_layout()
plt.savefig("fig.png", dpi=200)
這就是繪制最上面圖的代碼,我們再把圖展示一下,這樣可以更加直觀: