绘制对数坐标轴

584 投票
7 回答
1387797 浏览
提问于 2025-04-15 11:12

我想用matplotlib画一个图,其中有一个坐标轴是对数刻度。

下面是一个示例程序:

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

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

7 个回答

111

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

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

在Matplotlib 3.3之前,你需要用basex/basey来设置对数的底数。

400

首先,把 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 提供的图表刻度的例子。

671

你可以使用 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()

结果图表

撰写回答