【发布时间】:2020-07-29 18:25:09
【问题描述】:
我在使用 matplotlib(版本 3.1.3)时遇到问题:我想在对数刻度轴上添加自定义刻度和刻度标签,同时保留科学记数法。
换一种说法:我想在对数刻度轴上添加自定义刻度并使用老式的 '%1.1e'(或任何数字)格式标记它们,但例如,而不是使用 '2.5e -02',我想要'2.5 x 10^-2'(或乳胶中的'2.5 \times 10^{-2}')。
所以我从没有自定义刻度的最少工作代码开始:
import matplotlib as mpl
import matplotlib.pyplot as plt
print('MATPLOTLIB VERSION : %s' % mpl.__version__)
plt.style.use("default")
# DATA
x = [0.1, 0.075, 0.05, 0.025, 0.01, 0.0075, 0.005, 0.0025, 0.001, 0.00075, 0.0005, 0.00025, 0.0001, 7.5e-05, 5e-05, 2.5e-05, 1e-05, 1e-06, 1e-07, 1e-08, 1e-09, 1e-10]
y = x
fig = plt.figure()
ax = plt.axes()
plt.loglog()
plt.minorticks_off()
path = ax.plot(x, y)
plt.savefig('test.png')
给出:
很好,但正如我所说,我想在 xaxis 上添加自定义刻度。更准确地说,我想对轴设置限制,并在这些限制之间定义相等的对数间隔标签。假设我想要 4 个刻度;它给出了以下代码:
import matplotlib as mpl
import matplotlib.pyplot as plt
print('MATPLOTLIB VERSION : %s' % mpl.__version__)
plt.style.use("default")
# DATA
x = [0.1, 0.075, 0.05, 0.025, 0.01, 0.0075, 0.005, 0.0025, 0.001, 0.00075, 0.0005, 0.00025, 0.0001, 7.5e-05, 5e-05, 2.5e-05, 1e-05, 1e-06, 1e-07, 1e-08, 1e-09, 1e-10]
y = x
xmin = min(x)
xmax = max(x)
ymin = min(y)
ymax = max(y)
# XTICKS
nbdiv = 4
xTicks = []
k = pow((xmin/xmax),1./(nbdiv-1.))
for i in range(0,nbdiv):
xTicks.append(xmax*pow(k,i))
# PLOT
fig = plt.figure()
ax = plt.axes()
plt.loglog()
plt.minorticks_off()
plt.axis([xmin,xmax,ymin,ymax])
plt.xticks(xTicks)
path = ax.plot(x, y)
plt.savefig('test_working_4.png')
提供以下情节:
这就是我想要获得的结果。但是,如果刻度数 (nbdiv) 发生变化,例如变为等于 5,我会得到:
这一次只标记了第一个和最后一个刻度。似乎只有等于(或至少接近)十 (10^n) 的整数幂的数字才被标记。我尝试使用 matplot.ticker.ScalarFormatter 更改默认刻度格式,但我没有设法调整它来解决这个问题。我也尝试过 LogFormatterMathText 和 LogFormatterSciNotation,效果并不好。
这个问题本身对我来说似乎并不难,所以我不明白为什么我遇到这么多麻烦......我做错了什么?有人有钥匙让我理解我的错误吗?
无论如何,我感谢您的阅读,并提前感谢您的回复。
P.S.:抱歉可能出现的英语错误,这不是我的母语。
【问题讨论】:
标签: python matplotlib logarithm scientific-notation ticker