简介
在本教程中,你将学习如何使用 Matplotlib 创建一个带有两个 y 轴的图表。该图表将在不同的尺度上显示两组具有不同测量单位的数据。这种类型的图表在科学研究中通常用于可视化那些不能直接比较的变量之间的关系。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入库
首先,我们需要导入必要的库。我们将使用 Matplotlib 及其parasite_axes模块来创建图表。
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
from mpl_toolkits.axes_grid1.parasite_axes import HostAxes
定义数据
接下来,我们需要定义要绘制的数据。在这个例子中,我们有一组包含四个变量的观测数据:名称、角自行、角自行误差和距离。我们将把角自行转换为线速度,并将其与观测的半高宽(FWHM,Full Width at Half Maximum)进行绘制。
obs = [["01_S1", 3.88, 0.14, 1970, 63],
["01_S4", 5.6, 0.82, 1622, 150],
["02_S1", 2.4, 0.54, 1570, 40],
["03_S1", 4.1, 0.62, 2380, 170]]
## 从角自行转换为线速度的转换因子
pm_to_kms = 1./206265.*2300*3.085e18/3.15e7/1.e5
创建图表
现在我们将使用parasite_axes模块中的HostAxes和twin()函数来创建图表。HostAxes用于创建主图表,而twin()用于创建次 y 轴。
fig = plt.figure()
## 创建 HostAxes 对象
ax_kms = fig.add_subplot(axes_class=HostAxes, aspect=1)
## 使用变换后的坐标创建次 y 轴
aux_trans = mtransforms.Affine2D().scale(pm_to_kms, 1.)
ax_pm = ax_kms.twin(aux_trans)
## 绘制数据
for n, ds, dse, w, we in obs:
time = ((2007 + (10. + 4/30.)/12) - 1988.5)
v = ds / time * pm_to_kms
ve = dse / time * pm_to_kms
ax_kms.errorbar([v], [w], xerr=[ve], yerr=[we], color="k")
## 设置轴标签
ax_kms.axis["bottom"].set_label("Linear velocity at 2.3 kpc [km/s]")
ax_kms.axis["left"].set_label("FWHM [km/s]")
ax_pm.axis["top"].set_label(r"Proper Motion [$''$/yr]")
## 隐藏次 y 轴上的刻度标签
ax_pm.axis["right"].major_ticklabels.set_visible(False)
## 设置图表范围
ax_kms.set_xlim(950, 3700)
ax_kms.set_ylim(950, 3100)
显示图表
最后,我们将使用plt.show()函数来显示图表。
plt.show()
总结
在本教程中,你学习了如何使用 Matplotlib 创建具有两个 y 轴的图表。你学习了如何定义数据、创建图表以及显示图表。这种类型的图表对于可视化并非直接可比的变量之间的关系很有用。