Сюжет Matplotlib имеет наклонные линии - PullRequest
0 голосов
/ 03 января 2019

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

enter image description here

Как видите, углы между синими и зеленой линией слегка тупыевместо права.Я попытался поиграться с параметром rotation до функции annotate, но это не помогло.Код для этого графика приведен ниже, хотя данные могут выглядеть немного иначе, поскольку генератор случайных чисел не засеян:

import numpy as np
import matplotlib.pyplot as plt

prefs = {'color':'purple','edgecolors':'black'}
X = np.dot(np.random.rand(2,2), np.random.rand(2,50)).T
pts = np.linspace(-1,1)
v1_m = 0.8076549717643662

plt.scatter(X[:,0],X[:,1],**prefs)
plt.plot(pts, [v1_m*x for x in pts], color='lightgreen')

for x,y in X:
    # slope of connecting line
    # y = mx+b
    m = -np.reciprocal(v1_m)
    b = y-m*x

    # find intersecting point
    zx = b/(v1_m-m)
    zy = v1_m*zx

    # draw line
    plt.annotate('',(zx,zy),(x,y),arrowprops=dict(linewidth=2,arrowstyle='-',color='lightblue'))

plt.show()

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Синие линии не перпендикулярны из-за того, что оси не равны.

Вам просто нужно добавить строку ниже plt.show()

plt.gca().set_aspect('equal')

Ниже вы можете увидеть приведенный график:

enter image description here

0 голосов
/ 03 января 2019

Проблема заключается в неравных осях, из-за которых они выглядят не под прямым углом. Используйте plt.axis('equal'), чтобы иметь равные промежутки осей по осям X и Y и квадратную фигуру с равными высотой и шириной. plt.axis('scaled') работает так же. Как указывает @CedricZoppolo, вы должны установить равные пропорции перед plt.show(). Согласно документам, установка соотношения сторон на «равно» означает

одинаковое масштабирование от данных к единицам графика для x и y

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8))

# Your code here
plt.axis('equal')
plt.show()

enter image description here

Выбор квадратной фигуры необязателен, так как он работает и с прямоугольными фигурами, как

fig = plt.figure(figsize=(8,6))
# Your code here
plt.axis('equal')
plt.show()

enter image description here

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