Bagaimana saya bisa menghapus sumbu atas dan kanan di matplotlib?

133

Alih-alih gaya sumbu "kotak" default, saya hanya ingin memiliki sumbu kiri dan bawah, yaitu:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

Ini seharusnya mudah, tetapi saya tidak dapat menemukan opsi yang diperlukan dalam dokumen.

Michael Kuhn
sumber

Jawaban:

153

Ini adalah solusi yang disarankan Matplotlib 3 dari situs web resmi DI SINI :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

masukkan deskripsi gambar di sini

divenex
sumber
2
Ini lebih baik daripada jawaban yang diterima di versi yang lebih baru dari matplotlib.
meraba
3
Pertanyaan tambahan untuk pemula: di mana Anda dapat menemukan jawaban ini berdasarkan pada Matplotlib API doc? Jika saya pergi ke sana: matplotlib.org/api/axes_api.html Saya tidak melihat referensi ke spineobjek, dan saya tidak akan menebak kata kunci ini.
Eric Burel
63

Atau, ini

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

tampaknya mencapai efek yang sama pada sumbu tanpa kehilangan dukungan label yang diputar.

(Matplotlib 1.0.1; solusi yang terinspirasi oleh ini ).

timday
sumber
33

[sunting] matplotlib sekarang (2013-10) pada versi 1.3.0 yang mencakup ini

Kemampuan itu sebenarnya baru saja ditambahkan, dan Anda memerlukan versi Subversi untuk itu. Anda dapat melihat kode contoh di sini .

Saya baru saja memperbarui untuk mengatakan bahwa ada contoh online yang lebih baik sekarang. Masih membutuhkan versi Subversion, belum ada rilis dengan ini.

[sunting] Matplotlib 0.99.0 RC1 baru saja dirilis, dan termasuk kemampuan ini.

Autoplektik
sumber
Pastikan Anda membaca peringatan di matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/... tentang dukungan tanda centang menjadi tidak lengkap sebelum Anda mencoba dan menggunakan di atas dengan misalnya label yang diputar!
timday
Sepertinya tergantung pada bagaimana Anda membangun sumbu. Sumbu yang dihasilkan oleh mpl.subplotstidak dapat digunakan dengan cara ini?
Stefan van der Walt
8
Tautan contoh sekarang rusak.
mkosmala
10

(Ini lebih merupakan komentar ekstensi, di samping jawaban komprehensif di sini.)


Perhatikan bahwa kita dapat menyembunyikan masing-masing dari ketiga elemen ini secara independen satu sama lain:

  • Untuk menyembunyikan perbatasan (alias "tulang belakang"): ax.set_frame_on(False)atauax.spines['top'].set_visible(False)

  • Untuk menyembunyikan kutu: ax.tick_params(top=False)

  • Untuk menyembunyikan label: ax.tick_params(labeltop=False)

Evgeni Sergeev
sumber
ringkasan kemungkinan yang bagus. +1
loved.by.Yesus
9

Jika Anda tidak memerlukan tanda centang dan semacamnya (misalnya untuk merencanakan ilustrasi kualitatif), Anda juga dapat menggunakan solusi cepat ini:

Buat sumbu tidak terlihat (mis. Dengan plt.gca().axison = False) lalu gambar secara manual plt.arrow.

nikow
sumber
1
ini tampaknya menghapus duri tetapi meninggalkan tanda centang di tempatnya. Adakah cara untuk menghapus kutu juga?
Rob Young
2
@ Rob: Anda benar, saya sebenarnya menggunakan solusi berbeda dalam skrip yang saya pikirkan. Saya mengubah jawaban saya, ini seharusnya sudah berfungsi, tetapi secara umum solusi yang diterima di atas lebih baik.
nikow
9

Library Seaborn memiliki ini dibangun dengan fungsi despine ().

Cukup tambahkan:

import seaborn as sns

Sekarang buat grafik Anda. Dan tambahkan di akhir:

sns.despine()

Jika Anda melihat beberapa nilai parameter default dari fungsi itu menghapus tulang belakang atas dan kanan dan menjaga tulang belakang bagian bawah dan kiri:

sns.despine(top=True, right=True, left=False, bottom=False)

Lihat dokumentasi lebih lanjut di sini: https://seaborn.pydata.org/generated/seaborn.despine.html

Sander van den Oord
sumber
7

Jika Anda perlu menghapusnya dari semua plot Anda, Anda dapat menghapus duri dalam pengaturan gaya (style sheet atau rcParams). Misalnya:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Jika Anda ingin menghapus semua duri:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
hhh
sumber