Como equalizar as escalas do eixo xey no matplotlib Python?


128

Desejo desenhar linhas em um gráfico quadrado.

As escalas de x-axise y-axisdevem ser as mesmas.

por exemplo, x varia de 0 a 10 e está 10 cm na tela. y também deve variar de 0 a 10 e também deve ter 10 cm.

A forma quadrada tem que ser mantida, mesmo se eu mexer com o tamanho da janela.

Atualmente, meu gráfico é dimensionado junto com o tamanho da janela.

Como posso conseguir isso?

ATUALIZAR:

Tentei o seguinte, mas não funcionou.

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

Está funcionando para mim. Você pode postar um exemplo de código inteiro que não funciona? E você pode explicar o que não está funcionando? Você quer apenas a escala de Samen? Ou também o mesmo intervalo?
joris 01 de

1
@joris basicamente eu quero um gráfico SQUARE fixo. Mesmo que eu maximize a janela, espero que o SQUARE esteja reservado. Minha tela fica larga, depois de maximizar a janela, o gráfico também fica retangular. Quero que ainda seja QUADRADO
Sibbs Gambling

Novamente, você pode postar um exemplo de código completo. Como a resposta dada deve fazer isso, preserve-a como um quadrado. Não preserve sua largura ou altura, mas preserve sua forma.
joris 01 de

2
Tente ser um pouco menos abrasivo ao interagir com outras pessoas no SO. Você está recebendo ajuda pela bondade das pessoas, então aja com um pouco menos de direito.
tacaswell 01 de

para 3d, você precisa fazer um pouco mais de trabalho: stackoverflow.com/questions/13685386/…
Trevor Boyd Smith

Respostas:


179

Você precisa se aprofundar um pouco mais na API para fazer isso:

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 para set_aspect


4
Impressionante! Na verdade, funciona como um encanto. Você poderia me dizer o que plt.plot(range(5))e plt.gca().set_aspect('equal', adjustable='box')fazer, se não se importa? Além disso, percebo que mesmo que não o tenha feito plt.draw(), o enredo ainda aparecerá. Então qual é a utilidade disso?
Sibbs Gambling

o ploté apenas ter algo para mostrar. Para set_aspectler o link da documentação. O drawobjetivo é garantir que ele seja renderizado.
tacaswell

1
ter alguns dados falsos para traçar (deveria ter traçado uma linha reta).
tacaswell

1
@ perfectionm1ng não se preocupe, demorei um pouco para entender o que você estava perguntando.
tacaswell

1
Existe uma maneira de fazer isso sem precisar especificar exatamente os limites? Eu esperava que houvesse um comando simples para obter um gráfico quadrado com a mesma escala e pontos para ambos os eixos. Obrigado
Confundido em

70
plt.axis('scaled')

funciona bem para mim.


Também funcionou para mim. Apenas certifique-se de usar isso antes de definir limites / marcações, pois ele será redimensionado automaticamente.
Andrew

3
Desculpe, plt.axis ('scaled') não funcionou para mim no Python 3.7 e matplotlib - matplotlib == 3.1.0 No entanto, plt.axis ('square') funcionou!
rishi jain

19

Experimente algo como:

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

Isso funciona no meu sistema, talvez você pudesse mostrar uma parte do código em que está trabalhando? Pode ajudar a resolver o problema mais rápido.
Dman2 01 de

Isso NÃO funciona em geral. Os eixos são iguais, mas o gráfico não é quadrado, a menos que a janela de gráfico também seja quadrada. Testado com Matplotlib 2.0
divenex

P.axis('equal')parece ser assim P.gca().set_aspect('equal', adjustable='datalim'). Enquanto se adjustable='box', então a trama se torna quadrada.
Evgeni Sergeev

Eu definitivamente não consigo tirar uma caixa quadrada disso.
Peter Drake de

pylab está obsoleto
eric

19

Veja a documentação em plt.axis(). Este:

plt.axis('equal')

não funciona porque altera os limites do eixo para fazer os círculos parecerem circulares. O que você quer é:

plt.axis('square')

Isso cria um gráfico quadrado com eixos iguais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.