You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib极坐标轴中日出与日落线间区域的着色实现

解决极坐标图中日出-日落区间的黄色阴影填充问题

嘿,我完全懂你在极坐标里填充两条径向线(日出、日落)之间区域时的挫败感——plt.fill或plt.fill_between直接用确实容易踩坑,毕竟这两条线是从原点出发的射线,本身就不会相交,自然没法形成闭合区域供填充工具识别!

给你两个靠谱的解决方案,都是针对极坐标扇形区域填充的:

方案1:用Wedge补丁(最简便)

Matplotlib专门提供了Wedge类来绘制扇形,完美适配你要填充两条径向线之间区域的需求,步骤如下:

  1. 先获取你的极坐标轴对象,假设你已经创建了:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.patches as patches
    
    ax = plt.subplot(projection='polar')
    # 这里是你已有的绘图代码:绘制日出、正午、日落、物体方向线
    # ...
    
  2. 定义关键参数:

    • 日出/日落的方位角(注意是弧度,如果你的数据是角度,记得用np.deg2rad()转换)
    • 图的最大半径(可以直接获取当前轴的上限)
    theta_rise = np.deg2rad(60)  # 示例:日出方位角60度
    theta_set = np.deg2rad(300)  # 示例:日落方位角300度
    r_max = ax.get_ylim()[1]  # 获取当前极坐标图的最大半径
    
  3. 创建扇形补丁并添加到轴上:

    # 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:42:56