python - 具有两种不同线条样式的 Matplotlib 圆(椭圆)
问题描述
我一直在尝试绘制一个具有两个不同部分的椭圆(圆形),由两种不同的线条样式表示。因为我在 2D 空间中绘制具有 3D 坐标的椭圆,所以我希望 Z<0 的椭圆部分是不同的线型,而 Z>0 是另一种线型。然而,我最终得到一条穿过椭圆中间的线。这是我的代码的一小部分和示例图像:
import matplotlib.pyplot as plt
import numpy as np
class orbels:
import numpy as np
def __init__(self,a,e,i,O,w):
# import numpy as np
self.a=a
self.e=e
self.i=i*np.pi/180
self.O=O*np.pi/180
self.w=w*np.pi/180
def kep2cart(self):
cos=np.cos
sin=np.sin
pi=np.pi
theta=np.linspace(0,2*pi,500)
x=np.zeros(len(theta))
y=np.zeros(len(theta))
z=np.zeros(len(theta))
for j,t in enumerate(theta):
R=self.a * (1.-(self.e)**2)/(1+self.e * cos(t))
x[j]=R*(cos(self.O)*cos(self.w+t)-sin(self.O)*sin(self.w+t)*cos(self.i))
y[j]=R*(sin(self.O)*cos(self.w+t)+cos(self.O)*sin(self.w+t)*cos(self.i))
z[j]=R*sin(self.w+t)*sin(self.i)
return x,y,z
jup=orbels(5.2,0.048,1.3,100,14.8)
x5,y5,z5=jup.kep2cart()
plt.plot(x5[z5<0],y5[z5<0],'r--')
plt.plot(x5[z5>0],y5[z5>0],'r-',lw=2)
plt.plot(0,0,'ko',markersize=3)
plt.axis('equal')
plt.xlabel('X [AU]')
plt.ylabel('Y [AU]')
plt.xlim(-6,6)
plt.ylim(-6,6)
plt.legend()
plt.show()
上面的代码片段产生下图
有一条线穿过椭圆的中间。我猜,椭圆用实线绘制的部分,数据点从图形的一端跳到另一端,导致matplotlib连接点。解决这个问题的一种方法是不使用线,我可以使用点,但是我需要很多点来表示椭圆的连续部分。任何帮助将不胜感激!
解决方案
编写 时x5[z5<0]
,会创建一个较短的数组,过滤掉所有正 z 值。plt.plot()
将按照遇到的顺序连接点,这可能导致多余的对角线。
相反,使用掩码,数组保持其原始长度,并plt.plot()
跳过丢失的段。
from numpy import ma
plt.plot(ma.array(x5, mask=z5 < 0), ma.array(y5, mask=z5 < 0), 'r--')
plt.plot(ma.array(x5, mask=z5 > 0), ma.array(y5, mask=z5 > 0), 'r-', lw=2)
推荐阅读
- javascript - DiscordJS 编辑现有嵌入
- qt - 如何在 PQT5 的设计器中制作一个可以与其组件一起拉伸的窗口
- c++ - 如何微调/监控 Boost::ODEIt bulirsch stoer?
- java - Servlet 类在我的文件上传程序中不起作用
- reactjs - window.onmessage 在反应 js 组件中不起作用
- r - 忽略日期的月份差异
- javascript - 在 JavaScript 中从文件中加载文本
- swift - 如何更改GraphicalDatePickerStyle日期选择器Swiftui的选择颜色(AM,PM)和时间
- bash - 带或不带双引号的 bash 变量
- javascript - 如何在 JavaScript 中从多个数组中随机选择一个数组