首页 > 解决方案 > 具有两种不同线条样式的 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连接点。解决这个问题的一种方法是不使用线,我可以使用点,但是我需要很多点来表示椭圆的连续部分。任何帮助将不胜感激!

标签: pythonarraysmatplotlibplot

解决方案


编写 时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)

结果图


推荐阅读