เปลี่ยนมาตราส่วนแกน x ใน matplotlib


95

ฉันสร้างพล็อตนี้โดยใช้ Matlab

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

การใช้ matplotlib x-axies จะวาดตัวเลขขนาดใหญ่เช่น 100000, 200000, 300000 ฉันต้องการมีบางอย่างเช่น 1, 2, 3 และ 10 ^ 5 เพื่อระบุว่าเป็น 100000, 200000, 300000

มีวิธีง่ายๆในการสร้างมาตราส่วนดังกล่าวใน matplotlib หรือไม่?

คำตอบ:


147

ลองใช้matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

สิ่งนี้ใช้สัญกรณ์ทางวิทยาศาสตร์ (กล่าวคือa x 10^b) กับติ๊กมาร์กแกน x ของคุณ


9
เป็นไปได้ไหมที่จะเพิ่มค่าชดเชย (เช่นแทนที่จะเป็น 0.0, 0.5, 1.0, 1.5, ... และ x 10 ^ b จะเป็น 0, 5, 10, 15, ... และ x 10 ^ {b-1})
Eagle

24
ticklabel_formatนอกจากนี้ยังเป็นวิธีการสำหรับวัตถุแกนคุณสามารถลองบางอย่างเช่นax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
โควิช

มันจะทำงานได้อย่างไรถ้าคุณมีพล็อตย่อย 2 พล็อต?
FaCoffee

2
@ อีเกิลขอโทษคำถามติดตามของคุณเกี่ยวกับการเพิ่มออฟเซ็ตคือสิ่งที่ฉันอ้างถึง แกน x ของฉันคือ[0.1, 0.2, ...]และฉันต้องการ[1, 2, ...]ด้วยเลขชี้กำลังที่ปรับแล้ว คุณสามารถหาวิธีแก้ปัญหานั้นได้หรือไม่?
trianta2

@Eagle ฉันสนใจคำถามที่ trianta2 กล่าวถึงเช่นกัน
Ben Usman

15

นี่ไม่ใช่คำตอบสำหรับคำถามเดิมของคุณมากนักสำหรับคำถามที่คุณมีในเนื้อหาของคำถามของคุณ

เกริ่นไว้เล็กน้อยเพื่อให้การตั้งชื่อของฉันดูไม่แปลก:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

ดังที่ได้กล่าวไปแล้วคุณสามารถใช้ ticklabel_format เพื่อระบุว่า matplotlib ควรใช้สัญกรณ์ทางวิทยาศาสตร์สำหรับค่าขนาดใหญ่หรือเล็ก:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

คุณสามารถส่งผลต่อวิธีที่แสดงโดยใช้แฟล็กใน rcParams (จาก matplotlib import rcParams) หรือโดยการตั้งค่าโดยตรง ฉันไม่พบวิธีเปลี่ยนสัญกรณ์ทางวิทยาศาสตร์ระหว่าง '1e' และ 'x10 ^' ที่สวยงามกว่า:

ax.xaxis.major.formatter._useMathText = True

สิ่งนี้จะทำให้คุณได้ Matlab-esc มากขึ้นและมีลักษณะที่ดีกว่าอย่างแน่นอน ฉันคิดว่าสิ่งต่อไปนี้ควรทำเช่นเดียวกัน:

rc('text', usetex=True)

11

ตัวจัดรูปแบบสเกลาร์รองรับการรวบรวมเลขชี้กำลัง เอกสารมีดังนี้:

class matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) ฐาน: matplotlib.ticker.Formatter

ตำแหน่งติ๊กเป็นตัวเลขเก่าธรรมดา หาก useOffset == True และช่วงข้อมูลมีขนาดเล็กกว่าค่าเฉลี่ยของข้อมูลมากจะมีการกำหนดค่าชดเชยเพื่อให้ป้ายกำกับมีความหมาย สัญกรณ์วิทยาศาสตร์ใช้สำหรับข้อมูล <10 ​​^ -n หรือ data> = 10 ^ m โดยที่ n และ m เป็นขีด จำกัด กำลังที่กำหนดโดยใช้ set_powerlimits ((n, m)) ค่าดีฟอลต์สำหรับสิ่งเหล่านี้ถูกควบคุมโดยพารามิเตอร์ axes.formatter.limits rc

เทคนิคของคุณคือ:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

เพื่อให้ได้ตัวแทนที่แสดงในรูปแบบx10^5, อินสแตนซ์ ScalarFormatter useMathText=Trueด้วย

ภาพติดตา

คุณยังสามารถใช้:

xfmt.set_useOffset(10000)

เพื่อให้ได้ผลลัพธ์ดังนี้:

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


3
อินสแตนซ์ ScalarFormatter กับที่จะได้รับuseMathText=True x10^4
จนถึง Hoffmann

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