ลดจำนวนการลงจุด


160

ฉันมีเห็บบนกราฟมากเกินไปและพวกมันก็วิ่งเข้าหากัน

ฉันจะลดจำนวนเห็บได้อย่างไร

ตัวอย่างเช่นฉันมีเห็บ:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

และฉันแค่ต้องการ:

1E-5, 1E-3, ... 1E5, 1E7

ฉันได้ลองเล่นด้วยLogLocatorแต่ฉันก็ไม่สามารถหาคำตอบได้

คำตอบ:


266

หรือถ้าคุณต้องการที่จะกำหนดเพียงจำนวนเห็บขณะที่ช่วยให้ matplotlib ไปยังตำแหน่งที่พวกเขา (ปัจจุบันเท่านั้นที่มีMaxNLocator) มีpyplot.locator_params,

pyplot.locator_params(nbins=4)

คุณสามารถระบุแกนที่ระบุในวิธีนี้ตามที่ระบุไว้ด้านล่างค่าเริ่มต้นคือ:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
นี่เป็นข้อเสนอแนะที่ยอดเยี่ยมนอกจากนี้ยังสามารถระบุpyplot.locator_params(axis = 'x', nbins = 4)(หรือaxis = 'y') ทำให้กระบวนการตรงไปตรงมาจริงๆ ขอบคุณ @bgamari!
benjaminmgross

8
ด้วยขนาดของบันทึกสิ่งนี้จะทำงานร่วมกับnumticksแทนnbins
meduz

1
@ bgamari คุณช่วยเพิ่มnumticksโซลูชันสำหรับแปลงลอการิทึมตามที่ระบุโดย @meduz ได้ไหม?
Løiten

7
ดูเหมือนจะไม่ติดป้ายกำกับว่าควรอยู่ที่ไหน ตัวอย่างเช่นถ้าป้ายเห็บเดิม[0, 1, ..., 99]และตอนนี้หนึ่งชุดnticks=10แล้วป้ายเบาบางใหม่จะถูกวางไว้ครั้งสิบตราบใดออกจากกันตามแนวแกนคือตอนนี้1จะนั่งที่9เป็น2ที่19เป็น ... และ9ที่99เป็น
กลุ่ม

2
ตรวจสอบผลลัพธ์ของคุณก่อนที่จะเชื่อถือวิธีนี้ @Vim ถูกต้อง ค่าเห็บจะถูกวางอย่างไม่ถูกต้อง
David J.

53

หากใครยังคงได้รับหน้านี้ในผลการค้นหา:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
มันใช้งานได้จริงเทียบกับคำตอบอื่น ๆ ทั้งหมดที่ไม่ได้ทำอะไรเลย ขอบคุณ :)
faizan

ทำได้ดี. ฉันใช้เวลาสักครู่เพื่อค้นหาสิ่งนี้ แต่ทำในสิ่งที่ฉันต้องการ
จอห์น

ขอบคุณสิ่งนี้ช่วยให้มั่นใจได้ว่าฉลากใดที่ยังคงอยู่ในตำแหน่งที่ถูกต้อง ขั้นตอนเพิ่มเติมที่จะปรับปรุงคำตอบนี้คือการลบเครื่องหมายถูกด้วย
David J.

คำตอบง่ายๆที่ยอดเยี่ยม - ทำให้ประหลาดใจที่ชุมชน SO ไม่รู้จักวิธีกำหนดเอง นี่จะเป็นการเพิ่มคุณค่าให้กับ lib?
jabberwocky

32

หากต้องการแก้ปัญหาของการปรับแต่งและลักษณะที่ปรากฏของเห็บให้ดูที่คู่มือตัวระบุเห็บบนเว็บไซต์ matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

จะตั้งค่าจำนวนเห็บทั้งหมดในแกน x เป็น 3 และกระจายอย่างสม่ำเสมอทั่วทั้งแกน

นอกจากนี้ยังมีการสอนที่ดีเกี่ยวกับเรื่องนี้


เลือกดัชนี 3 วันแรกเท่านั้น เมื่อรับขวานจาก pandas.DataFrame.plot ax = df.plot()
มิ ธ ริล

@ มิ ธ ริลขออภัยฉันไม่เข้าใจความคิดเห็นของคุณ คุณช่วยอธิบายรายละเอียดได้ไหม?
Prageeth Jayathissa

ถ้าฉันมี df ( pandas.DataFrame) พร้อมดัชนีวันที่และเวลา [2019-01-01, ... 2019-11-01], โทร ax = df.plot(), ส่งคืนวัตถุรูป การโทรax.xaxis.set_major_locator(plt.MaxNLocator(3)) แสดงเฉพาะ 3 ดัชนีแรก [2019-01-01, 2019-01-02, 2019-01-03]
มิ ธ ริล

1
@Mithril, df.plot()มักจะแสดงดังนั้นคุณอาจต้องการที่จะลองminor_locator ax1.xaxis.set_minor_locator(plt.MaxNLocator(3))นอกจากนี้อย่าลืมแทนที่3จำนวนเห็บที่คุณต้องการแสดง สำหรับชุดไทม์แพนด้าฉันแนะนำ import matplotlib.dates as mdatesและทำงานax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))ด้วยax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

มีset_ticks()ฟังก์ชั่นสำหรับวัตถุแกน


4
สิ่งนี้จะใช้ได้ถ้าฉันรู้ล่วงหน้าว่าฉันต้องการเห็บอะไร ตัวอย่างที่ฉันให้ไว้ข้างต้นเป็นเพียงตัวอย่างเท่านั้น ฉันไม่รู้ว่าเห็บคืออะไรฉันเพิ่งรู้ว่าฉันต้องการน้อยกว่านั่นคือทุก ๆ อัน
jlconlin

10
คุณสามารถโทรหาget_xticks()หรือครั้งแรกสำหรับวัตถุแกนแก้ไขตามความจำเป็นและแล้วผ่านรายการกลับไปที่get_yticks() set_ticks()
user812786

4
ฉันไม่ได้มีset_ticks()แต่ฉันไม่ได้และset_xticks() set_yticks()เหล่านี้เป็นคุณลักษณะของวัตถุแกนไม่ใช่แกน อาจมีการเปลี่ยนแปลงในช่วงสองสามปีที่ผ่านมา
Gauthier

2
ฉันไม่แน่ใจว่าฉันควรบางคนพบว่าคำตอบของคุณมีประโยชน์อย่างที่เป็นอยู่และเพียงเพราะความแตกต่างสำหรับฉันไม่ได้หมายความว่าสำหรับทุกคน
โกติเยร์

1
ตัวอย่างจะไปไกลในการทำให้คำตอบนี้มีประโยชน์
Richard

10

ในกรณีที่ใครบางคนยังคงต้องการมันและเนื่องจากไม่มีอะไรที่นี่ใช้ได้ผลสำหรับฉันฉันจึงคิดหาวิธีที่ง่ายมากที่จะรักษารูปลักษณ์ของพล็อตที่สร้างขึ้น "ตามสภาพ" ในขณะที่แก้ไขจำนวนเห็บให้ตรงกับ N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
ฉันต้องแก้ไขบรรทัดสุดท้ายเล็กน้อยเพื่อให้มันคืนค่า int แทนการลอย:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje ยังคงลอยอยู่กับฉัน!
Mohd

4

วิธีแก้ปัญหาที่ @ ราฟาเอลให้นั้นตรงไปตรงมาและมีประโยชน์มาก

ยังคงมีป้ายแสดงเห็บจะไม่ได้รับค่าตัวอย่างจากการกระจายเดิม แต่จากดัชนีnp.linspace(ymin, ymax, N)ของอาร์เรย์ที่ส่งกลับโดย

ในการแสดงค่า N ที่เว้นระยะเท่ากันจากป้ายกำกับเห็บเดิมให้ใช้set_yticklabels()วิธีการ นี่คือตัวอย่างสำหรับแกน y ที่มีป้ายกำกับจำนวนเต็ม:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

รุ่งโรจน์สำหรับการบิดที่ดีนี้!
Mohd

2

เมื่อมีการใช้มาตราส่วนการบันทึกจำนวนของการทำเครื่องหมายที่สำคัญสามารถแก้ไขได้ด้วยคำสั่งต่อไปนี้

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

ค่าที่ตั้งไว้เพื่อnumticksกำหนดจำนวนของเครื่องหมายแกนที่จะแสดง

เครดิตไปยังโพสต์ของ @ bgamari สำหรับการแนะนำlocator_params()ฟังก์ชั่น แต่nticksพารามิเตอร์จะพ่นข้อผิดพลาดเมื่อใช้สเกลบันทึก


คำถามและคำตอบสำหรับ matplotlib ก่อนหน้านี้คือ 1 และคุณหมายถึง 2
277 Dawid Laszuk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.