绘制对数轴

问题描述 投票:0回答:7

我想使用 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()
python matplotlib logarithm yticks
7个回答
653
投票

您可以使用

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


394
投票

首先,混合

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()
替换它。请记住,您还可以使用
pyplot.xscale()
(或
Axes.set_xscale()
)更改 X 轴的比例。

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


108
投票

如果你想改变对数的底数,只需添加:

plt.yscale('log',base=2) 

在 Matplotlib 3.3 之前,您必须使用 basex/basey 作为 log 的基础


78
投票

您只需使用 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()

12
投票

我知道这有点偏离主题,因为一些评论提到

ax.set_yscale('log')
是“最好的”解决方案,我认为可能需要反驳。我不建议使用
ax.set_yscale('log')
来绘制直方图和条形图。在我的版本(0.99.1.1)中,我遇到了一些渲染问题 - 不确定这个问题有多普遍。然而 bar 和 hist 都有可选参数来将 y 尺度设置为日志,这可以正常工作。

参考资料: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

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


11
投票

因此,如果您只是使用不复杂的 API,就像我经常使用的那样(我在 ipython 中经常使用它),那么这就是简单的

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

希望这可以帮助那些寻找简单答案的人! :).


0
投票

本页提供了一些方法(semilogxsemilogyloglog),但它们在幕后都执行相同的操作,即调用

set_xscale('log')
(对于 x 轴)和
set_yscale('log') 
(对于 y 轴)。此外,
plt.yscale
/
plt.scale
是状态机中的函数,它们调用当前 Axes 对象上的
set_yscale
/
set_xscale
。即使对于条形图(以及直方图,因为它们只是条形图),
log=True
参数也会根据条形方向调用
set_yscale('log')
/
set_xscale('log')

所以无论你使用哪一个,它们最终都会调用相同的方法。顺便说一句,除了能够选择日志的基础之外,您还可以在同一函数调用中设置次要刻度位置(使用

subs
kwarg)。

data = np.random.choice(np.logspace(-0.5, 1, base=20), 10)
plt.plot(data)
plt.yscale('log', base=10, subs=[10**x for x in (0.25, 0.5, 0.75)], nonpositive='mask')
#                          ^^^ <-- 3 equal-spaced minor ticks       ^^^^ mask invalid values

© www.soinside.com 2019 - 2024. All rights reserved.