Eixo Y reverso no PyPlot

265

Eu tenho um gráfico de dispersão com um monte de coordenadas x, y aleatórias. Atualmente, o eixo Y começa em 0 e sobe para o valor máximo. Eu gostaria que o eixo Y iniciasse no valor máximo e subisse para 0.

points = [(10,5), (5,11), (24,13), (7,8)]    
x_arr = []
y_arr = []
for x,y in points:
    x_arr.append(x)
    y_arr.append(y)
plt.scatter(x_arr,y_arr)
DarkAnt
fonte

Respostas:

557

Existe uma nova API que torna isso ainda mais simples.

plt.gca().invert_xaxis()

e / ou

plt.gca().invert_yaxis()
Demitri
fonte
49
Esteja ciente de que você deve definir os limites do eixo antes de invertê-lo, caso contrário, ele será invertido novamente.
TheBigH 22/01
55

A resposta de DisplacedAussie está correta, mas geralmente um método mais curto é apenas para reverter o único eixo em questão:

plt.scatter(x_arr, y_arr)
ax = plt.gca()
ax.set_ylim(ax.get_ylim()[::-1])

onde a gca()função retorna a instância atual do Axes e [::-1]reverte a lista.

Tim Whitcomb
fonte
3
Essa parece ser uma resposta melhor para mim. :)
DisplacedAussie
18

Use matplotlib.pyplot.axis ()

axis([xmin, xmax, ymin, ymax])

Então você pode adicionar algo assim no final:

plt.axis([min(x_arr), max(x_arr), max(y_arr), 0])

Embora você queira preenchimento em cada extremidade, para que os pontos extremos não fiquem na borda.

DeslocadoAussie
fonte
Isso tem uma vantagem em relação às duas primeiras respostas: ela corrige a orientação, não a inverte toda vez (que é um problema se você precisar chamá-la em loop).
Bas Swinckels 04/08/19
16

Se você estiver no pylabmodo ipython , então

plt.gca().invert_yaxis()
show()

o show()é necessário para torná-lo atualizar a figura atual.

charles.fox
fonte
9

Você também pode usar a função exposta pelo objeto de eixos do gráfico de dispersão

scatter = plt.scatter(x, y)
ax = scatter.axes
ax.invert_xaxis()
ax.invert_yaxis()
ShikharDua
fonte
8

Outro método semelhante aos descritos acima é usar, plt.ylimpor exemplo:

plt.ylim(max(y_array), min(y_array))

Esse método funciona para mim quando estou tentando compor vários conjuntos de dados em Y1 e / ou Y2

Mortsde
fonte
3

Usar ylim () pode ser a melhor abordagem para seu propósito:

xValues = list(range(10))
quads = [x** 2 for x in xValues]
plt.ylim(max(quads), 0)
plt.plot(xValues, quads)

resultará:insira a descrição da imagem aqui

Farzad Vertigo
fonte
2

Como alternativa, você pode usar a função matplotlib.pyplot.axis () , que permite inverter qualquer um dos eixos da plotagem

ax = matplotlib.pyplot.axis()
matplotlib.pyplot.axis((ax[0],ax[1],ax[3],ax[2]))

Ou se você preferir reverter apenas o eixo X, então

matplotlib.pyplot.axis((ax[1],ax[0],ax[2],ax[3]))

Na verdade, você pode inverter os dois eixos:

matplotlib.pyplot.axis((ax[1],ax[0],ax[3],ax[2]))
Luis DG
fonte
0

Se você estiver usando o matplotlib, poderá tentar: matplotlib.pyplot.xlim(l, r) matplotlib.pyplot.ylim(b, t)

Essas duas linhas definem os limites dos eixos x e y, respectivamente. Para o eixo x, o primeiro argumento l define o valor mais à esquerda e o segundo argumento r define o valor mais à direita. Para o eixo y, o primeiro argumento b define o valor mais baixo e o segundo argumento t define o valor mais alto.

Andy Turner
fonte