Matplotlib极坐标轴中日出与日落线间区域的着色实现
解决极坐标图中日出-日落区间的黄色阴影填充问题
嘿,我完全懂你在极坐标里填充两条径向线(日出、日落)之间区域时的挫败感——plt.fill或plt.fill_between直接用确实容易踩坑,毕竟这两条线是从原点出发的射线,本身就不会相交,自然没法形成闭合区域供填充工具识别!
给你两个靠谱的解决方案,都是针对极坐标扇形区域填充的:
方案1:用Wedge补丁(最简便)
Matplotlib专门提供了Wedge类来绘制扇形,完美适配你要填充两条径向线之间区域的需求,步骤如下:
先获取你的极坐标轴对象,假设你已经创建了:
import matplotlib.pyplot as plt import numpy as np import matplotlib.patches as patches ax = plt.subplot(projection='polar') # 这里是你已有的绘图代码:绘制日出、正午、日落、物体方向线 # ...定义关键参数:
- 日出/日落的方位角(注意是弧度,如果你的数据是角度,记得用
np.deg2rad()转换) - 图的最大半径(可以直接获取当前轴的上限)
theta_rise = np.deg2rad(60) # 示例:日出方位角60度 theta_set = np.deg2rad(300) # 示例:日落方位角300度 r_max = ax.get_ylim()[1] # 获取当前极坐标图的最大半径- 日出/日落的方位角(注意是弧度,如果你的数据是角度,记得用
创建扇形补丁并添加到轴上:
# Wedge参数:center是原点(0,0),r是扇形半径,theta1/theta2是起始/结束角度(注意这里要转成**角度**) sunlit_wedge = patches.Wedge((0, 0), r_max, np.rad2deg(theta_rise), np.rad2deg(theta_set), color='yellow', alpha=0.2) ax.add_patch(sunlit_wedge)
方案2:手动构建闭合多边形(用plt.fill)
如果你更习惯用基础的fill方法,可以手动构建一个闭合的扇形路径,本质是把原点、日出径向线端点、日落径向线端点、原点连起来形成闭合区域:
# 生成日出到日落之间的角度序列(越多越平滑) theta_fill = np.linspace(theta_rise, theta_set, 100) # 对应每个角度的半径都设为最大半径 r_fill = np.full_like(theta_fill, r_max) # 转换为笛卡尔坐标(极坐标轴下也可以直接用极坐标参数,但转换后更稳妥) x = np.concatenate([[0], r_max * np.cos(theta_fill), [0]]) y = np.concatenate([[0], r_max * np.sin(theta_fill), [0]]) # 填充闭合区域 ax.fill(x, y, color='yellow', alpha=0.2)
为什么之前的方法没成功?
plt.fill_between的设计逻辑是填充同一x轴区间内两条y曲线之间的区域,但你的日出/日落线是单角度的径向线(只有一个theta值,对应多个r值),不属于连续的x(theta)区间,自然无法触发填充逻辑。而上面两种方法都是主动构建了闭合的扇形区域,完美避开了这个问题。
内容的提问来源于stack exchange,提问作者Craver2000
相关产品推荐
相关产品推荐

