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)
这就是绘制最上面图的代码,我们再把图展示一下,这样可以更加直观: