WedX - журнал о программировании и компьютерных науках

Круг Matplotlib (эллипс) с двумя разными стилями линий

Я пытался построить эллипс (круг) с двумя разными секциями, представленными двумя разными стилями линий. Поскольку я строю эллипс с 3D-координатами в 2D-пространстве, я хочу, чтобы часть эллипса с 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()

Приведенный выше фрагмент дает следующий рисунок Ellipse Plot

Через середину эллипса проходит линия. Я предполагаю, что в той части, где эллипс нарисован непрерывной линией, точки данных перескакивают с одного конца фигуры на другой, заставляя matplotlib соединять точки. Один из способов решить эту проблему - вместо использования линий я мог бы использовать точки, но тогда мне нужно много точек для представления непрерывной части эллипса. Любая помощь будет очень признательна!


Ответы:


1

Когда вы пишете 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)

результат

07.12.2020
  • Большое спасибо за быстрое и элегантное решение. Я не знал о модуле ma в numpy! 08.12.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]