Làm cách nào để cân bằng tỷ lệ của trục x và trục y trong Python matplotlib?


128

Tôi muốn vẽ các đường trên một đồ thị hình vuông.

Quy mô của x-axisy-axisphải giống nhau.

ví dụ: x nằm trong khoảng từ 0 đến 10 và nó là 10cm trên màn hình. y cũng phải nằm trong khoảng từ 0 đến 10 và cũng phải là 10 cm.

Hình dạng vuông phải được duy trì, ngay cả khi tôi lộn xộn với kích thước cửa sổ.

Hiện tại, biểu đồ của tôi chia tỷ lệ cùng với kích thước cửa sổ.

Làm thế nào tôi có thể đạt được điều này?

CẬP NHẬT:

Tôi đã thử những điều sau đây, nhưng nó không hoạt động.

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

Đó là làm việc cho tôi. Bạn có thể đăng toàn bộ một ví dụ mã không hoạt động không? Và bạn có thể giải thích những gì không hoạt động? Bạn có muốn chỉ cùng một quy mô? Hoặc cũng có cùng một phạm vi?
joris

1
@joris về cơ bản tôi muốn có một đồ thị SQUARE cố định. Ngay cả khi tôi tối đa hóa cửa sổ, tôi hy vọng rằng SQUARE được bảo lưu. Màn hình của tôi rộng, sau khi tôi phóng to cửa sổ, biểu đồ cũng trở thành hình chữ nhật. Tôi muốn nó được vẫn SQUARE
Sibbs Cờ bạc

Một lần nữa, bạn có thể đăng một ví dụ mã đầy đủ. Vì câu trả lời đã cho nên làm thế, bảo toàn nó như một hình vuông. Không phải bảo toàn chiều rộng hay chiều cao của nó, nhưng giữ nguyên hình dạng của nó.
joris

2
Hãy cố gắng bớt mài mòn một chút khi tương tác với những người khác trên SO. Bạn đang nhận được sự giúp đỡ từ lòng tốt của mọi người vì vậy hãy hành động bớt quyền lợi hơn một chút.
tacaswell

cho 3d, bạn phải làm thêm một công việc chút: stackoverflow.com/questions/13685386/...
Trevor Boyd Smith

Câu trả lời:


179

Bạn cần tìm hiểu sâu hơn một chút về api để làm điều này:

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()

doc cho set_aspect


4
Tuyệt vời! Nó thực sự hoạt động như một sự quyến rũ. Bạn có thể vui lòng cho tôi biết những gì plt.plot(range(5))plt.gca().set_aspect('equal', adjustable='box')làm gì, nếu bạn không phiền? Ngoài ra, tôi nhận thấy rằng ngay cả khi tôi không có plt.draw(), cốt truyện vẫn sẽ hiển thị. Sau đó, việc sử dụng nó là gì?
Sibbs Gambling vào

các plotchỉ được có cái gì để hiển thị. Đối với set_aspectliên kết tài liệu đọc. Chỉ drawlà để đảm bảo rằng nó được hiển thị.
tacaswell

1
để có một số dữ liệu giả để vẽ (lẽ ra nó phải vẽ một đường thẳng).
tacaswell

1
@ perfectm1ng đừng lo lắng, tôi đã mất một lúc để tìm ra những gì bạn đang hỏi.
tacaswell

1
Có cách nào để hoàn thành việc này mà không cần chỉ định chính xác các giới hạn không? Tôi đã mong đợi có một lệnh đơn giản để có được một ô vuông có cùng tỷ lệ và tích cho cả hai trục. Cảm ơn
Bối rối

70
plt.axis('scaled')

hoạt động tốt cho tôi.


Cũng làm việc cho tôi. Chỉ cần đảm bảo sử dụng điều này trước khi đặt giới hạn / đánh dấu, vì nó sẽ tự động bán lại.
Andrew

3
Xin lỗi, plt.axis ('scale') không hoạt động với tôi trong Python 3.7 và matplotlib - matplotlib == 3.1.0 Tuy nhiên, plt.axis ('square') đã hoạt động!
rishi jain

19

Hãy thử một cái gì đó như:

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

Điều này hoạt động trên hệ thống của tôi, có lẽ bạn có thể hiển thị một phần của mã bạn đang làm việc? Có thể giúp giải quyết vấn đề nhanh hơn.
Dman2

Điều này KHÔNG hoạt động nói chung. Các trục bằng nhau, nhưng ô không phải là hình vuông, trừ khi cửa sổ vẽ cũng là hình vuông. Đã thử nghiệm với Matplotlib 2.0
lặn phụ lục

P.axis('equal')dường như là như thế P.gca().set_aspect('equal', adjustable='datalim'). Trong khi nếu adjustable='box', thì âm mưu trở thành hình vuông.
Evgeni Sergeev

Tôi chắc chắn không nhận được một hộp vuông ra khỏi này.
Peter Drake

pylab không được dùng nữa
eric

19

Xem tài liệu trên plt.axis(). Điều này:

plt.axis('equal')

không hoạt động vì nó thay đổi giới hạn của trục để làm cho các đường tròn có dạng hình tròn. Những gì bạn muốn là:

plt.axis('square')

Điều này tạo ra một ô vuông với các trục bằng nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.