ฉันมีเห็บบนกราฟมากเกินไปและพวกมันก็วิ่งเข้าหากัน
ฉันจะลดจำนวนเห็บได้อย่างไร
ตัวอย่างเช่นฉันมีเห็บ:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
และฉันแค่ต้องการ:
1E-5, 1E-3, ... 1E5, 1E7
ฉันได้ลองเล่นด้วยLogLocator
แต่ฉันก็ไม่สามารถหาคำตอบได้
ฉันมีเห็บบนกราฟมากเกินไปและพวกมันก็วิ่งเข้าหากัน
ฉันจะลดจำนวนเห็บได้อย่างไร
ตัวอย่างเช่นฉันมีเห็บ:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
และฉันแค่ต้องการ:
1E-5, 1E-3, ... 1E5, 1E7
ฉันได้ลองเล่นด้วยLogLocator
แต่ฉันก็ไม่สามารถหาคำตอบได้
คำตอบ:
หรือถ้าคุณต้องการที่จะกำหนดเพียงจำนวนเห็บขณะที่ช่วยให้ 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)
numticks
แทนnbins
numticks
โซลูชันสำหรับแปลงลอการิทึมตามที่ระบุโดย @meduz ได้ไหม?
[0, 1, ..., 99]
และตอนนี้หนึ่งชุดnticks=10
แล้วป้ายเบาบางใหม่จะถูกวางไว้ครั้งสิบตราบใดออกจากกันตามแนวแกนคือตอนนี้1
จะนั่งที่9
เป็น2
ที่19
เป็น ... และ9
ที่99
เป็น
หากใครยังคงได้รับหน้านี้ในผลการค้นหา:
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)
หากต้องการแก้ปัญหาของการปรับแต่งและลักษณะที่ปรากฏของเห็บให้ดูที่คู่มือตัวระบุเห็บบนเว็บไซต์ matplotlib
ax.xaxis.set_major_locator(plt.MaxNLocator(3))
จะตั้งค่าจำนวนเห็บทั้งหมดในแกน x เป็น 3 และกระจายอย่างสม่ำเสมอทั่วทั้งแกน
นอกจากนี้ยังมีการสอนที่ดีเกี่ยวกับเรื่องนี้
ax = df.plot()
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]
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'))
มีset_ticks()
ฟังก์ชั่นสำหรับวัตถุแกน
get_xticks()
หรือครั้งแรกสำหรับวัตถุแกนแก้ไขตามความจำเป็นและแล้วผ่านรายการกลับไปที่get_yticks()
set_ticks()
set_ticks()
แต่ฉันไม่ได้และset_xticks()
set_yticks()
เหล่านี้เป็นคุณลักษณะของวัตถุแกนไม่ใช่แกน อาจมีการเปลี่ยนแปลงในช่วงสองสามปีที่ผ่านมา
ในกรณีที่ใครบางคนยังคงต้องการมันและเนื่องจากไม่มีอะไรที่นี่ใช้ได้ผลสำหรับฉันฉันจึงคิดหาวิธีที่ง่ายมากที่จะรักษารูปลักษณ์ของพล็อตที่สร้างขึ้น "ตามสภาพ" ในขณะที่แก้ไขจำนวนเห็บให้ตรงกับ 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))
ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
วิธีแก้ปัญหาที่ @ ราฟาเอลให้นั้นตรงไปตรงมาและมีประโยชน์มาก
ยังคงมีป้ายแสดงเห็บจะไม่ได้รับค่าตัวอย่างจากการกระจายเดิม แต่จากดัชนี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)
เมื่อมีการใช้มาตราส่วนการบันทึกจำนวนของการทำเครื่องหมายที่สำคัญสามารถแก้ไขได้ด้วยคำสั่งต่อไปนี้
import matplotlib.pyplot as plt
....
plt.locator_params(numticks=12)
plt.show()
ค่าที่ตั้งไว้เพื่อnumticks
กำหนดจำนวนของเครื่องหมายแกนที่จะแสดง
เครดิตไปยังโพสต์ของ @ bgamari สำหรับการแนะนำlocator_params()
ฟังก์ชั่น แต่nticks
พารามิเตอร์จะพ่นข้อผิดพลาดเมื่อใช้สเกลบันทึก
pyplot.locator_params(axis = 'x', nbins = 4)
(หรือaxis = 'y'
) ทำให้กระบวนการตรงไปตรงมาจริงๆ ขอบคุณ @bgamari!