Python,matplotlib:如何将tick标签值设置为其对数值

时间:2014-11-11 22:55:00

标签: python matplotlib plot logarithm

我有一些数据可以在半对数图上绘制(log-lin样式,在y轴上具有对数刻度)。有没有办法将y轴刻度标签从实际值更改为对数值?

例如,请考虑以下代码:

import matplotlib.pyplot as plt
import numpy as np

x=np.array([1,2,3,4,5])
def f(x):
    return 10**(x-1)

plt.plot(x,f(x))
plt.yscale(u'log')

plt.show()

产生以下情节: enter image description here

(对不起,它有点大,我不知道如何缩小它,随时编辑以帮助解决这个问题)。

在该图中,刻度标签显示为10 ^ 0,10 ^ 1,10 ^ 2等;但是我希望它们显示为对数值:0,1,2等。

我意识到我可以返回并将plt.plot(x,f(x))更改为plt.plot(x,np.log10(f(x))),然后再次使y轴呈线性而不是对数,但我想知道是否有matplotlib只能更改y-轴刻度值本身,我不必将np.log10()放在plt.plot()的所有plt.plot()中。我之所以这样做是双重的:我的代码中有很多{{1}}行,我宁愿不回去为所有这些行改变它,然后我就不会有对数间隔的小刻度(虽然我确定即使使用线性轴也有某种方法可以改变它。)

编辑:我知道this question与我有一些相似之处,但不一样。该问题中的人想要将刻度标签从科学形式更改为"正常"小数形式。我想将我的刻度标签从科学形式更改为数字的对数(基数10)值。我确信答案将与我所链接的答案类似,但对我而言,如何做到这一点并不明显。事实上,我在发布之前查看了这个问题,但仍然决定发布我的问题,因为我不知道如何将它应用于我的问题。对于有经验的程序员来说,很明显如何应用与我的情况相关的问题的方法,但对我来说并不是很明显,所以请引导我完成它。

如果您可以向我展示一个代码示例(通过复制我的代码示例并添加必要的行),我将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以使用自定义格式化程序,例如:

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
import numpy as np
import math

x=np.array([1,2,3,4,5])

def f(x):
    return 10**(x-1)

plt.plot(x,f(x))
plt.yscale(u'log')

#SET CUSTORM TICK FORMATTING
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda x,y: '{}'.format(math.log(x, 10))))

plt.show()