พล็อตลอการิทึมแกนกับ matplotlib ในหลาม


369

ฉันต้องการพล็อตกราฟด้วยแกนลอการิทึมหนึ่งแกนโดยใช้ matplotlib

ฉันอ่านเอกสารแล้ว แต่ไม่สามารถเข้าใจไวยากรณ์ได้ ฉันรู้ว่ามันอาจเป็นเรื่องง่ายเหมือน'scale=linear'ในข้อโต้แย้งเรื่องการลงจุด แต่ฉันไม่สามารถทำให้ถูกต้องได้

โปรแกรมตัวอย่าง:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()

คำตอบ:


384

คุณสามารถใช้Axes.set_yscaleวิธีการ ที่ช่วยให้คุณเปลี่ยนสเกลหลังจากAxesวัตถุถูกสร้างขึ้น ซึ่งจะช่วยให้คุณสร้างตัวควบคุมเพื่อให้ผู้ใช้สามารถเลือกขนาดได้ถ้าคุณต้องการ

บรรทัดที่เกี่ยวข้องที่จะเพิ่มคือ:

ax.set_yscale('log')

คุณสามารถใช้'linear'เพื่อเปลี่ยนกลับเป็นสเกลเชิงเส้น นี่คือลักษณะของรหัสของคุณ:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

แผนภูมิผลลัพธ์


6
วิธีนี้เป็นวิธีที่ดีเพราะมันทำงานร่วมกับทุกประเภทของการแปลง (เช่น histograms) ไม่เพียง แต่กับ "พล็อต" (ซึ่งเป็นสิ่งที่ semilogx / semilogy ไม่)
ทิม Whitcomb

16
ฉันมาที่นี่เพื่อค้นหาวิธีการใช้แกนสำหรับพลังของสอง: pylab.gca () set_xscale ('log', basex = 2)
zje

53
Matplotlib semilogy()มี นอกจากนี้ยังง่ายต่อการใช้งานpyplot.yscale()มากกว่าการใช้โดยตรงax.set_yscale('log')เนื่องจากไม่จำเป็นต้องรับaxวัตถุ (ซึ่งไม่สามารถใช้งานได้ทันที)
Eric O Lebigot

5
หากคุณต้องการเครื่องชั่งบันทึกในทั้งสองแกนลองloglog()หรือบนแกน x ลองเท่านั้นsemilogx()
drevicko

10
@EOL ฉันอยากจะแนะนำตรงกันข้าม มันจะดีกว่าที่จะใช้อย่างชัดเจนaxวัตถุที่ใช้pyplotซึ่งอาจจะนำไปใช้กับแกนที่คุณต้องการให้
tacaswell

288

ก่อนอื่นการผสมpylabและpyplotโค้ดไม่เป็นระเบียบ มีอะไรมากกว่าที่สไตล์ pyplot เป็นที่ต้องการมากกว่าการใช้ pylab

นี่คือรหัสการทำความสะอาดเล็กน้อยใช้pyplotฟังก์ชั่นเท่านั้น:

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

pyplot.yscale()ฟังก์ชั่นที่เกี่ยวข้องคือ Axes.set_yscale()หากคุณใช้รุ่นเชิงวัตถุแทนที่โดยวิธีการ โปรดจำไว้ว่าคุณสามารถเปลี่ยนขนาดของแกน X โดยใช้pyplot.xscale()(หรือAxes.set_xscale())

ตรวจสอบคำถามของฉัน'log' และ 'symlog' แตกต่างกันอย่างไร? เพื่อดูตัวอย่างของกราฟขนาดที่ matplotlib เสนอ


มีช่วงเวลาที่ยากลำบากในการหาวิธีการทำ คำตอบนี้ช่วยวันของฉัน!
HWende

13
pyplot.semilogy()โดยตรงมากขึ้น
Eric O Lebigot

64

คุณเพียงแค่ต้องใช้semilogyแทนพล็อต:

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()

1
ฮ่า ๆ ฉันกำลังพยายามเข้าสู่ระบบ (FloatArray) สำหรับช่วงเวลาขอบคุณที่คุณบันทึกวันของฉัน
Pradeep

5
นอกจากนี้ยังมีsemilogx หากคุณต้องการเข้าสู่ระบบทั้งสองแกนให้ใช้loglog
drevicko

40

ถ้าคุณต้องการเปลี่ยนฐานของลอการิทึมเพียงเพิ่ม:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log

8

ฉันรู้ว่านี่เป็นเรื่องนอกหัวข้อเล็กน้อยเนื่องจากความคิดเห็นบางส่วนกล่าวถึงax.set_yscale('log')วิธีแก้ปัญหาที่ "อร่อยที่สุด" ฉันคิดว่าการโต้แย้งอาจเกิดขึ้นได้ ฉันจะไม่แนะนำให้ใช้ax.set_yscale('log')สำหรับฮิสโทแกรมและพล็อตบาร์ ในรุ่นของฉัน (0.99.1.1) ฉันพบปัญหาการแสดงผลบางอย่าง - ไม่แน่ใจว่าปัญหานี้เป็นเรื่องทั่วไป อย่างไรก็ตามทั้ง bar และ hist มีอาร์กิวเมนต์ที่เป็นทางเลือกเพื่อตั้งค่า y-scale ให้เข้าสู่ระบบซึ่งทำงานได้ดี

การอ้างอิง: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist


5

ดังนั้นหากคุณใช้ API ที่ไม่ซับซ้อนเช่นฉันมักจะเป็น (ฉันใช้มันใน ipython บ่อยๆ) นี่ก็เป็นเพียง

yscale('log')
plot(...)

หวังว่านี่จะช่วยให้ใครบางคนกำลังมองหาคำตอบง่ายๆ! :)


-1

คุณสามารถใช้รหัสด้านล่าง:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.