在python中使用matplotlib绘制对数轴


369

我想使用matplotlib绘制一个对数轴的图形。

我一直在阅读文档,但无法弄清楚语法。我知道这可能'scale=linear'与plot参数类似,但是我似乎无法正确理解

示例程序:

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

Answers:


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
这种方法很好,因为它适用于各种图(例如直方图),而不仅适用于“图”(这是Semilogx /符号学所做的)
Tim Whitcomb,2009年

16
我来这里寻找的是如何使用轴的二次方:pylab.gca()。set_xscale('log',basex = 2)
zje 2012

53
Matplotlib有semilogy()。此外,与直接使用pyplot.yscale()相比,使用起来更容易ax.set_yscale('log'),因为不需要获取ax对象(并非总是立即可用)。
Eric O Lebigot

5
如果要在两个轴上都使用对数刻度,请尝试loglog()或仅在x轴上尝试semilogx()
drevicko 2013年

10
@EOL我建议相反。这是更好地使用一个明确的ax目标,要使用pyplot可能适用于您希望它的轴。
塔卡斯韦尔

288

首先,混合pylabpyplot编码不是很整洁。而且,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()。请记住,您还可以使用pyplot.xscale()(或Axes.set_xscale())更改X轴的比例。

检查我的问题'log'和'symlog'有什么区别?查看matplotlib提供的图形比例的一些示例。


很难弄清楚该怎么做。这个答案救了我一天!
HWende 2012年

13
pyplot.semilogy()更直接。
Eric O Lebigot

64

您只需要使用符号学而不是情节:

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
大声笑,我一直在尝试使用log(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比例设置为log,这很好用。

参考: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)')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.