在极坐标轴上填充两条线之间的区域(matplotlib)

4

目前,我的数据图表显示出日出(蓝色)、正午(红色)、日落(橙色)和一个物体(绿色)的方向。我想在日出和日落之间创建一个黄色阴影区域。我考虑使用 plt.fill 方法,但是当我添加了 plt.fill_between(theta1, theta2, R1, alpha=0.2) 后,好像并没有起作用。我认为这是因为这两条线并没有相交。我的当前极坐标图表如下:

enter image description here

脚本的相关部分是:
    #for object
    theta0 = np.deg2rad([190, 190])
    print ("theta0= %s" %theta0)    
    R0 = [0,0.4]

    #for sunrise
    theta1 = np.deg2rad([105, 105])
    print ("theta1= %s" %theta1)    
    R1 = [0,1]

    #for sunset
    theta2 = np.deg2rad([254, 254])
    print ("theta2= %s" %theta2)    
    R1 = [0,1]

    #for midday 
    theta3 = np.deg2rad([0.2, 0.2])
    print ("theta3= %s" %theta3)    
    R3 = [0,1]

    ax.set_theta_zero_location("S")
    ax.set_theta_direction(-1)

    ax.plot(theta1,R1, theta2, R1, theta0, R0, lw=5)

    #plt.fill_between(theta1, theta2, R1, alpha=0.2) #does not work


    plt.savefig('plot.png')

我也考虑使用正午方位角,然后利用从日出到日落的角度差计算出宽度,再利用这些生成阴影区域。我该如何操作?我只想在日出和日落之间生成黄色阴影区域,因此我认为从中午的θ生成width是一个好主意。我尝试复制ax以形成ax2,然后可以潜在地将其用于显示中午的width(阴影区域)。但是添加了ax2后,似乎会破坏绘图。我该如何解决?

黄色区域应该在图中的哪个位置出现? - ImportanceOfBeingErnest
在蓝色和橙色线之间,分别代表日出和日落。 - Craver2000
1个回答

10
要在极坐标图上使用fill_between,您需要将其调用为:
plt.fill_between(angles_to_go_through, minimum_radii, maximum_radii)

所以举个例子,填充0到90度之间的区域会是这样的:
ax.fill_between(
    np.linspace(0, pi/2, 100),  # Go from 0 to pi/2
    0,                          # Fill from radius 0
    1,                          # To radius 1
)

这将生成类似于下图的图表:

极坐标填充

在您的情况下,您需要调用:
ax.fill_between(
    np.linspace(theta1[0], theta2[0], 100),  # Need high res or you'll fill a triangle
    0,
    1,
    alpha=0.2,
    color='y',
)

感谢bheklir的解释和建议。现在我已经得到了阴影区域。然而,阴影区域似乎在图形的错误侧面(在顶部而不是底部)。我该怎么做才能告诉脚本去填充另一个弧形?我想可以使用中午来告诉脚本阴影区域应该在哪里。这样做可行吗?如果可以,如何使用中午(红线表示)来告诉plt.fill函数在日出和日落之间通过中午填充阴影区域? - Craver2000
@Craver2000 我想我误解了,您是想填充代表白天或黑夜的弧形吗?如果是后者,那么您只需要稍微更改np.linspace的调用。如果您从theta2[0]theta1[0] + pi,那么应该会填充更长的弧形。 - bheklilr
谢谢您的建议。我也在考虑这样一种情况,即如果有一天theta2为260,而theta1为350(仍然小于360),那么将pi加到theta1会影响阴影面积吗?我之所以问这个问题是因为我正在开发一个脚本,它将在不同时间/地点的太阳运动变化中继续工作。 - Craver2000
那会影响到事情,是的。你可以尝试开发一些复杂的表达式来解决这个问题,或者你可以使用一个快速的if语句来检查这种情况。 - bheklilr
好的,我会尝试。 - Craver2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接