简介
在本实验中,我们将学习如何使用 Matplotlib 的 floating_axes 模块来创建非矩形形状的自定义绘图。当我们需要在非笛卡尔坐标系(如极坐标或对数图)上绘制数据时,此模块非常有用。我们将演示如何使用不同的坐标系创建散点图、条形图和扇形图。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到 笔记本 标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入必要的库
首先,我们需要导入必要的库。我们将使用 Matplotlib、NumPy 以及 mpl_toolkits.axisartist 和 mpl_toolkits.axisartist.grid_finder 中的一些模块。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D
import mpl_toolkits.axisartist.angle_helper as angle_helper
import mpl_toolkits.axisartist.floating_axes as floating_axes
from mpl_toolkits.axisartist.grid_finder import (DictFormatter, FixedLocator,
MaxNLocator)
创建一个简单的浮动坐标轴绘图
在这一步中,我们将使用 GridHelperCurveLinear 创建一个简单的浮动坐标轴绘图。我们将创建一个具有非矩形形状的散点图和一个条形图。
def setup_axes1(fig, rect):
tr = Affine2D().scale(2, 1).rotate_deg(30)
grid_helper = floating_axes.GridHelperCurveLinear(
tr, extremes=(-0.5, 3.5, 0, 4),
grid_locator1=MaxNLocator(nbins=4),
grid_locator2=MaxNLocator(nbins=4))
ax1 = fig.add_subplot(
rect, axes_class=floating_axes.FloatingAxes, grid_helper=grid_helper)
ax1.grid()
aux_ax = ax1.get_aux_axes(tr)
return ax1, aux_ax
fig = plt.figure(figsize=(8, 4))
fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95)
ax1, aux_ax1 = setup_axes1(fig, 131)
aux_ax1.bar([0, 1, 2, 3], [3, 2, 1, 3])
创建极坐标图
在这一步中,我们将使用 GridHelperCurveLinear 创建一个极坐标图。我们将创建一个具有非矩形形状的散点图。
def setup_axes2(fig, rect):
tr = PolarAxes.PolarTransform()
pi = np.pi
angle_ticks = [(0, r"$0$"),
(.25*pi, r"$\frac{1}{4}\pi$"),
(.5*pi, r"$\frac{1}{2}\pi$")]
grid_locator1 = FixedLocator([v for v, s in angle_ticks])
tick_formatter1 = DictFormatter(dict(angle_ticks))
grid_locator2 = MaxNLocator(2)
grid_helper = floating_axes.GridHelperCurveLinear(
tr, extremes=(.5*pi, 0, 2, 1),
grid_locator1=grid_locator1,
grid_locator2=grid_locator2,
tick_formatter1=tick_formatter1,
tick_formatter2=None)
ax1 = fig.add_subplot(
rect, axes_class=floating_axes.FloatingAxes, grid_helper=grid_helper)
ax1.grid()
aux_ax = ax1.get_aux_axes(tr)
aux_ax.patch = ax1.patch
ax1.patch.zorder = 0.9
return ax1, aux_ax
ax2, aux_ax2 = setup_axes2(fig, 132)
theta = np.random.rand(10)*.5*np.pi
radius = np.random.rand(10) + 1.
aux_ax2.scatter(theta, radius)
创建扇形图
在这一步中,我们将使用 GridHelperCurveLinear 创建一个扇形图。我们将创建一个具有非矩形形状的散点图。
def setup_axes3(fig, rect):
tr_rotate = Affine2D().translate(-95, 0)
tr_scale = Affine2D().scale(np.pi/180., 1.)
tr = tr_rotate + tr_scale + PolarAxes.PolarTransform()
grid_locator1 = angle_helper.LocatorHMS(4)
tick_formatter1 = angle_helper.FormatterHMS()
grid_locator2 = MaxNLocator(3)
ra0, ra1 = 8.*15, 14.*15
cz0, cz1 = 0, 14000
grid_helper = floating_axes.GridHelperCurveLinear(
tr, extremes=(ra0, ra1, cz0, cz1),
grid_locator1=grid_locator1,
grid_locator2=grid_locator2,
tick_formatter1=tick_formatter1,
tick_formatter2=None)
ax1 = fig.add_subplot(
rect, axes_class=floating_axes.FloatingAxes, grid_helper=grid_helper)
ax1.axis["left"].set_axis_direction("bottom")
ax1.axis["right"].set_axis_direction("top")
ax1.axis["bottom"].set_visible(False)
ax1.axis["top"].set_axis_direction("bottom")
ax1.axis["top"].toggle(ticklabels=True, label=True)
ax1.axis["top"].major_ticklabels.set_axis_direction("top")
ax1.axis["top"].label.set_axis_direction("top")
ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]")
ax1.axis["top"].label.set_text(r"$\alpha_{1950}$")
ax1.grid()
aux_ax = ax1.get_aux_axes(tr)
aux_ax.patch = ax1.patch
ax1.patch.zorder = 0.9
return ax1, aux_ax
ax3, aux_ax3 = setup_axes3(fig, 133)
theta = (8 + np.random.rand(10)*(14 - 8))*15.
radius = np.random.rand(10)*14000.
aux_ax3.scatter(theta, radius)
显示绘图
最后,我们需要使用 Matplotlib 的 show() 函数来显示绘图。
plt.show()
总结
在本实验中,我们学习了如何使用 Matplotlib 的 floating_axes 模块来创建具有非矩形形状的自定义绘图。我们使用不同的坐标系创建了散点图、条形图和扇形图。我们使用 GridHelperCurveLinear 创建必要的变换,使用 FixedLocator 和 MaxNLocator 设置网格线,并使用 DictFormatter 和 FormatterHMS 格式化刻度标签。