如何用Matplotlib的mosaic创建含笛卡尔与极坐标的双子图
修改Matplotlib subplot_mosaic实现笛卡尔+极坐标子图
要实现左侧笛卡尔坐标系、右侧极坐标系的水平排列子图,只需对现有代码做3处关键修改:
修改点说明
- 调整子图布局:将原来垂直排列的两行一列,改为水平排列的一行两列
- 指定极坐标投影:给右侧子图设置
projection="polar"参数 - 适配极坐标绘图数据:极坐标需要极角(θ)和半径(r),原信号
s有正负值,需处理为非负半径(比如加偏移),同时将t转换为极角所需的弧度单位(Matplotlib极坐标默认角度单位为弧度)
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np t = np.arange(0, 30, 0.1) s = np.sin(2 * np.pi * 1 * t) # 处理半径为非负值,避免极坐标绘图异常 r = s + 1 fig = plt.figure(layout="constrained") ax_dict = fig.subplot_mosaic( # 改为水平一行两列的布局 [["signal1", "signal2"]], # 给右侧子图指定极坐标投影 ax_kw={"signal2": {"projection": "polar"}} ) # 左侧笛卡尔坐标系绘图 ax_dict["signal1"].plot(t, s) ax_dict["signal1"].set_title("笛卡尔坐标系") ax_dict["signal1"].set_xlabel("时间t") ax_dict["signal1"].set_ylabel("信号值s") # 右侧极坐标系绘图:将t转为弧度作为极角,r作为半径 ax_dict["signal2"].plot(t, r) ax_dict["signal2"].set_title("极坐标系") ax_dict["signal2"].set_rmax(2) # 设置最大半径显示值 plt.show()
额外说明
- 如果希望极角使用角度单位,可将
t转为弧度后传入:t * np.pi / 180 - 若不需要保留信号正负信息,也可以用
np.abs(s)作为半径,根据需求选择即可
内容的提问来源于stack exchange,提问作者Mo0nKizz
相关产品推荐
相关产品推荐

