Membalikkan Y-Axis di PyPlot

265

Saya memiliki grafik sebar plot dengan sekelompok koordinat x, y acak. Saat ini Y-Axis mulai dari 0 dan naik ke nilai maksimal. Saya ingin Y-Axis mulai dari nilai maks dan naik ke 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)
Gelap
sumber

Jawaban:

557

Ada API baru yang membuatnya lebih sederhana.

plt.gca().invert_xaxis()

dan / atau

plt.gca().invert_yaxis()
Demitri
sumber
49
Ketahuilah bahwa Anda harus menetapkan batas sumbu sebelum Anda membalik sumbu, jika tidak maka akan membatalkan pembalikan lagi.
TheBigH
55

Jawaban DisplacedAussie benar, tetapi biasanya metode yang lebih pendek hanya untuk membalikkan sumbu tunggal yang dimaksud:

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

di mana gca()fungsi mengembalikan instance Axes saat ini dan [::-1]membalik daftar.

Tim Whitcomb
sumber
3
Itu sepertinya jawaban yang lebih baik untuk saya. :)
DisplacedAussie
18

Gunakan matplotlib.pyplot.axis ()

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

Jadi Anda bisa menambahkan sesuatu seperti ini di akhir:

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

Meskipun Anda mungkin ingin melapisi di setiap ujung sehingga titik-titik ekstrim tidak duduk di perbatasan.

DisusterAussie
sumber
Ini memiliki keunggulan dibandingkan dua jawaban pertama yang memperbaiki orientasi, bukan membalik setiap kali (yang merupakan masalah jika Anda perlu menyebutnya dalam satu lingkaran).
Bas Swinckels
16

Jika Anda berada di ipython dalam pylabmode, maka

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

yang show()diperlukan untuk membuatnya memperbarui angka saat ini.

charles.fox
sumber
9

Anda juga bisa menggunakan fungsi yang diekspos oleh objek sumbu plot sebar

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

Metode lain yang serupa dengan yang dijelaskan di atas adalah menggunakan plt.ylimmisalnya:

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

Metode ini bekerja untuk saya ketika saya mencoba untuk menggabungkan beberapa set data pada Y1 dan / atau Y2

Mortsde
sumber
3

menggunakan ylim () mungkin merupakan pendekatan terbaik untuk tujuan Anda:

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

akan menghasilkan:masukkan deskripsi gambar di sini

Farzad Vertigo
sumber
2

Atau, Anda dapat menggunakan fungsi matplotlib.pyplot.axis () , yang memungkinkan Anda membalikkan salah satu sumbu plot

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

Atau jika Anda lebih suka hanya membalikkan sumbu X, maka

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

Memang, Anda dapat membalikkan kedua sumbu:

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

Jika menggunakan matplotlib Anda dapat mencoba: matplotlib.pyplot.xlim(l, r) matplotlib.pyplot.ylim(b, t)

Kedua garis ini menetapkan batas sumbu x dan y masing-masing. Untuk sumbu x, argumen pertama l menetapkan nilai paling kiri, dan argumen kedua r menetapkan nilai paling kanan. Untuk sumbu y, argumen pertama b menetapkan nilai terbawah, dan argumen kedua t menetapkan nilai terbanyak.

Andy Turner
sumber