ฉันจะลบแกนด้านบนและด้านขวาใน matplotlib ได้อย่างไร


134

แทนที่จะเป็นสไตล์แกน "แบบบรรจุกล่อง" เริ่มต้นฉันต้องการให้มีเฉพาะแกนด้านซ้ายและด้านล่างเช่น:

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

สิ่งนี้น่าจะง่าย แต่ฉันไม่พบตัวเลือกที่จำเป็นในเอกสาร

คำตอบ:


155

นี่คือโซลูชัน Matplotlib 3 ที่แนะนำจากเว็บไซต์ทางการที่นี่ :

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

ป้อนคำอธิบายภาพที่นี่


2
นี่ดีกว่าคำตอบที่ยอมรับใน matplotlib เวอร์ชันใหม่กว่า
ffledgling

4
คำถามเพิ่มเติมสำหรับผู้เริ่มต้น: คุณจะหาคำตอบนี้จากเอกสาร Matplotlib API ได้ที่ไหน ถ้าฉันไปที่นั่น: matplotlib.org/api/axes_api.htmlฉันไม่เห็นการอ้างอิงถึงspineออบเจ็กต์ใด ๆและฉันคงเดาคำหลักนี้ไม่ได้
Eric Burel

63

หรืออีกวิธีนี้

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

ดูเหมือนว่าจะได้ผลเช่นเดียวกันกับแกนโดยไม่สูญเสียการรองรับฉลากแบบหมุน

(Matplotlib 1.0.1; โซลูชันที่ได้รับแรงบันดาลใจจากสิ่งนี้ )


33

[แก้ไข] matplotlib ในตอนนี้ (2013-10) ในเวอร์ชัน 1.3.0 ซึ่งรวมถึงสิ่งนี้ด้วย

ความสามารถนั้นเพิ่งเพิ่มเข้ามาจริง ๆ และคุณต้องมีเวอร์ชันโค่นล้ม คุณสามารถดูรหัสตัวอย่างที่นี่

ฉันแค่อัปเดตเพื่อบอกว่าตอนนี้มีตัวอย่างที่ดีกว่าทางออนไลน์แล้ว ยังคงต้องการเวอร์ชัน Subversion แต่ยังไม่มีการเปิดตัวในเรื่องนี้

[แก้ไข] Matplotlib 0.99.0 RC1 เพิ่งเปิดตัวและรวมถึงความสามารถนี้ด้วย


ตรวจสอบให้แน่ใจว่าคุณได้อ่านคำเตือนที่matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/…เกี่ยวกับการรองรับเครื่องหมายถูกไม่สมบูรณ์ก่อนที่คุณจะลองและใช้ด้านบนด้วยเช่นป้ายกำกับแบบหมุน!
timday

ดูเหมือนว่ามันขึ้นอยู่กับว่าคุณสร้างแกนอย่างไร แกนที่สร้างโดยmpl.subplotsไม่สามารถใช้ด้วยวิธีนี้?
Stefan van der Walt

8
ตอนนี้ลิงค์ตัวอย่างเสียแล้ว
mkosmala

10

(นี่เป็นความคิดเห็นเพิ่มเติมนอกเหนือจากคำตอบที่ครอบคลุมที่นี่)


โปรดทราบว่าเราสามารถซ่อนองค์ประกอบทั้งสามนี้โดยอิสระจากกัน:

  • หากต้องการซ่อนเส้นขอบ (หรือที่เรียกว่า "กระดูกสันหลัง"): ax.set_frame_on(False)หรือax.spines['top'].set_visible(False)

  • วิธีซ่อนเห็บ: ax.tick_params(top=False)

  • ในการซ่อนป้ายกำกับ: ax.tick_params(labeltop=False)


สรุปความเป็นไปได้ที่ดี +1
loved.by.Jesus

9

หากคุณไม่ต้องการเห็บและอื่น ๆ (เช่นสำหรับการวางแผนภาพประกอบเชิงคุณภาพ) คุณสามารถใช้วิธีแก้ปัญหาสั้น ๆ นี้ได้:

ทำให้แกนที่มองไม่เห็น (เช่นกับplt.gca().axison = False) plt.arrowแล้ววาดด้วยตนเองด้วย


1
ดูเหมือนว่าจะเอาเงี่ยงออก แต่ทิ้งเครื่องหมายถูกไว้ มีความคิดที่จะกำจัดเห็บด้วยหรือไม่?
Rob Young

2
@ Rob: คุณพูดถูกจริงๆฉันใช้วิธีแก้ปัญหาอื่นในสคริปต์ที่ฉันคิด ฉันเปลี่ยนคำตอบตอนนี้ควรใช้งานได้แล้ว แต่โดยทั่วไปวิธีแก้ปัญหาที่ยอมรับข้างต้นดีกว่า
nikow

9

Library Seaborn มีฟังก์ชัน despine () ในตัว

เพียงเพิ่ม:

import seaborn as sns

ตอนนี้สร้างกราฟของคุณ และเพิ่มในตอนท้าย:

sns.despine()

หากคุณดูค่าพารามิเตอร์เริ่มต้นบางส่วนของฟังก์ชันฟังก์ชันนี้จะลบกระดูกสันหลังด้านบนและด้านขวาและเก็บกระดูกสันหลังด้านล่างและด้านซ้ายไว้:

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

ดูเอกสารเพิ่มเติมที่นี่: https://seaborn.pydata.org/generated/seaborn.despine.html


7

หากคุณต้องการลบออกจากพล็อตทั้งหมดของคุณคุณสามารถลบกระดูกสันหลังในการตั้งค่าสไตล์ (สไตล์ชีตหรือ RCParams) เช่น:

import matplotlib as mpl

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

หากคุณต้องการลบเงี่ยงทั้งหมด:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.