Вращение эллипса, но оси имеют совершенно разные масштабы, что приводит к искажению - PullRequest
0 голосов
/ 09 января 2020

Итак, я пытаюсь построить некоторые данные, которые у меня есть, и нарисовать доверительный эллипс с заданным средним значением и ковариацией поверх него. Я очень плохо знаком с Python, но я подумал, что это будет намного проще визуализировать, чем это было бы в Java (где я рассчитал эти значения, использованные).

Проблема, с которой я сейчас сталкиваюсь, заключается в что я просто не могу вращать рисованный эллипс, не искажая его. Я не совсем уверен, так ли это на самом деле, но я думаю, что это из-за совершенно разных масштабов на осях (х от 0 до 6, у от 40 до 100). Еще раз, я предполагаю, но я бы предположил, что вращение не масштабирует высоту (которая явно соответствует оси y от 40 до 100), поэтому она слишком длинна для моей короткой оси x.

Мой вопрос: есть ли лучший способ сделать это или способ масштабировать эллипс после вращения, чтобы он снова соответствовал? Поскольку я на самом деле не очень много знаю о Python, я просто прошел различные уроки, чтобы быстро увидеть, что дает мне результат. Не уверен, что это «правильный» способ для начала. Однако я знаю, что все примеры, которые я видел, имеют одинаково масштабированные оси, поэтому я не смог найти адекватного решения своей проблемы.

Это всего лишь часть кода, реальные данные не являются включен, но он все еще должен быть способен копировать-вставлять для эллипса, чтобы вы, ребята, могли понять, что я имею в виду, если вы измените угол поворота (45 в этом примере).

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse

meanX = 2.0374
meanY = 54.4897
secondLongest = 0.0700
longest = 33.7679

ax = plt.subplot(111)

plt.axis([0, 6, 40, 100])
#plt.plot(duration, waitperiod, "rx")
plt.xlabel("Duration")
plt.ylabel("Time between eruptions")

#if rotation is set to 0, it works perfectly fine but I want a different angle
ellipse = Ellipse((meanX, meanY), 2*np.sqrt(5.991*secondLongest), 2*np.sqrt(5.991*longest), 45)

ax.add_artist(ellipse)

plt.show()

1 Ответ

0 голосов
/ 09 января 2020

Это работает отлично, видимое искажение, которое вы видите, действительно из-за различного масштабирования ваших осей X и Y на графике. Например, попробуйте с этими пределами оси, чтобы увидеть, что угол больше не «искажает»:

plt.axis([-20, 20, 40, 80])

(и убедитесь, что ваше окно графика тоже квадратное)

Если этот эллипс представляет уверенность, Я сомневаюсь, что вы хотите изменить его масштаб, чтобы он соответствовал вашим произвольным пределам осей, вместо этого вы, вероятно, хотите установить пределы своих осей, чтобы они соответствовали вашим данным и эллипсу доверия ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...