我有一些数据可以在半对数图上绘制(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()
产生以下情节:
(对不起,它有点大,我不知道如何缩小它,随时编辑以帮助解决这个问题)。
在该图中,刻度标签显示为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)值。我确信答案将与我所链接的答案类似,但对我而言,如何做到这一点并不明显。事实上,我在发布之前查看了这个问题,但仍然决定发布我的问题,因为我不知道如何将它应用于我的问题。对于有经验的程序员来说,很明显如何应用与我的情况相关的问题的方法,但对我来说并不是很明显,所以请引导我完成它。
如果您可以向我展示一个代码示例(通过复制我的代码示例并添加必要的行),我将非常感激。
答案 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()