Как уравнять масштабы оси x и оси y в Python matplotlib?


128

Я хочу нарисовать линии на квадратном графике.

Масштабы x-axisи y-axisдолжны быть одинаковыми.

например, x находится в диапазоне от 0 до 10, а на экране это 10 см. y также должен находиться в диапазоне от 0 до 10 и также должен составлять 10 см.

Квадратная форма должна быть сохранена, даже если я возился с размером окна.

В настоящее время мой график масштабируется вместе с размером окна.

Как я могу этого добиться?

ОБНОВИТЬ:

Я пробовал следующее, но это не сработало.

plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.axis('equal')

У меня это работает. Можете ли вы опубликовать весь пример кода, который не работает? А можно объяснить, что не работает? Вы хотите только тот же масштаб? Или тоже такой же диапазон?
joris 01

1
@joris в основном мне нужен фиксированный квадратный график. Даже если я разверну окно до максимума, я надеюсь, что КВАДРАТ зарезервирован. У меня широкий экран, после развертывания окна график также становится прямоугольным. Я хочу, чтобы все было по-прежнему ПЛОЩАДЬ
Sibbs Gambling

Опять же, можете ли вы опубликовать полный пример кода. Поскольку данный ответ должен делать это, сохраните его в виде квадрата. Не сохранять ширину и высоту, а сохранять форму.
joris

2
Пожалуйста, постарайтесь быть немного менее резким при общении с другими на SO. Вы получаете помощь от доброты людей, поэтому действуйте немного менее правомочно.
tacaswell 01

для 3D вам нужно проделать небольшую дополнительную работу: stackoverflow.com/questions/13685386/…
Trevor Boyd Smith

Ответы:


179

Для этого вам нужно немного углубиться в api:

from matplotlib import pyplot as plt
plt.plot(range(5))
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.gca().set_aspect('equal', adjustable='box')
plt.draw()

документ для set_aspect


4
Потрясающие! Это действительно работает как шарм. Подскажите, пожалуйста, что plt.plot(range(5))и plt.gca().set_aspect('equal', adjustable='box')делать, если не возражаете? Кроме того, я замечаю, что даже если у меня его нет plt.draw(), сюжет все равно появится. Тогда какая от этого польза?
Sibbs Gambling 02

plotпросто есть что показать. Для set_aspectчтения ссылки документации. Это drawпросто для того, чтобы убедиться, что он отображается.
tacaswell 02

1
чтобы иметь какие-то поддельные данные для построения (он должен был построить прямую линию).
tacaswell 02 авг.13,

1
@ perfectionm1ng, не беспокойтесь, мне потребовалось время, чтобы понять, о чем вы спрашиваете.
tacaswell 02 авг.13,

1
Есть ли способ сделать это без точного указания ограничений? Я ожидал, что будет простая команда для получения квадратного графика с одинаковым масштабом и отметками для обеих осей. Спасибо
Confounded

70
plt.axis('scaled')

у меня хорошо работает.


Также работал у меня. Просто убедитесь, что вы используете это перед установкой лимитов / тиков, так как масштаб будет изменяться автоматически.
Эндрю

3
Извините, plt.axis ('scaled') не работал у меня в Python 3.7 и matplotlib - matplotlib == 3.1.0 Однако plt.axis ('square') работал!
риши джайн

19

Попробуйте что-нибудь вроде:

import pylab as p
p.plot(x,y)
p.axis('equal')
p.show()

Это работает в моей системе, возможно, вы могли бы показать часть кода, над которым вы работаете? Возможно, поможет решить проблему быстрее.
Dman2 01

В общем, это НЕ работает. Оси равны, но график не квадратный, если только окно построения также не квадратное. Протестировано с помощью Matplotlib 2.0
divenex

P.axis('equal')вроде бы нравится P.gca().set_aspect('equal', adjustable='datalim'). А если adjustable='box', то сюжет становится квадратным.
Евгений Сергеев

У меня точно квадратная коробка из этого не получается.
Питер Дрейк

pylab устарел
eric

19

См. Документацию на plt.axis(). Это:

plt.axis('equal')

не работает, потому что он изменяет пределы оси, чтобы круги выглядели круглыми. Вы хотите:

plt.axis('square')

Это создает квадратный участок с равными осями.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.