matplotlib 禁止科学记数法

zvms9eto  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(353)

下面的代码:

plt.plot(range(2003,2012,1),range(200300,201200,100))
# several solutions from other questions have not worked, including
# plt.ticklabel_format(style='sci', axis='x', scilimits=(-1000000,1000000))
# ax.get_xaxis().get_major_formatter().set_useOffset(False)
plt.show()

生成以下曲线图:

如何防止科学记数法?Is ticklabel_format broken?不能解决实际删除偏移量的问题。

plt.plot(np.arange(1e6, 3 * 1e7, 1e6))
plt.ticklabel_format(useOffset=False)

k5ifujac

k5ifujac1#

在您的例子中,您实际上希望禁用偏移。使用科学记数法是一个独立的设置,不同于根据偏移值显示内容。
然而,ax.ticklabel_format(useOffset=False)应该可以工作(尽管您将其列为不能工作的东西之一)。
例如:

fig, ax = plt.subplots()
ax.plot(range(2003,2012,1),range(200300,201200,100))
ax.ticklabel_format(useOffset=False)
plt.show()

如果你想同时禁用偏移和科学记数法,你可以使用ax.ticklabel_format(useOffset=False, style='plain')

“偏移量”和“科学记数法”之间的区别

在matplotlib轴格式中,“科学记数法”指的是所显示数字的 * 乘数 *,而“偏移量”是一个单独的项,是 * 相加的 *。
请看这个例子:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1000, 1001, 100)
y = np.linspace(1e-9, 1e9, 100)

fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()

x轴将有一个偏移量(注意+符号),y轴将使用科学记数法(作为乘数--没有加号)。

我们可以分别禁用其中一个,最方便的方法是ax.ticklabel_format方法(或plt.ticklabel_format)。
例如,如果我们调用:

ax.ticklabel_format(style='plain')

我们将禁用y轴上的科学记数法:

如果我们打电话

ax.ticklabel_format(useOffset=False)

我们将禁用x轴上的偏移,但不更改y轴的科学记数法:

最后,我们可以通过以下方式禁用这两种功能:

ax.ticklabel_format(useOffset=False, style='plain')

qco9c6ql

qco9c6ql2#

另一种防止使用科学记数法的方法是使用scilimits=参数“加宽”不使用科学记数法的区间。

plt.plot(np.arange(1e6, 3 * 1e7, 1e6))
plt.ticklabel_format(scilimits=(-5, 8))

这里,如果轴限制小于10^-5或大于10^8,则在轴上使用科学记数法。
默认情况下,小于10^-5或大于10^6的数字使用科学计数法,因此如果刻度的最大值在此间隔内,则不使用科学计数法。
所以这个阴谋是由

plt.plot(np.arange(50), np.logspace(0, 6));
plt.ylim((0, 1000000))

具有科学记数法,因为1000000=10^6,但由

plt.plot(np.arange(50), np.logspace(0, 6));
plt.ylim((0, 999999));

不会,因为y限制(999999)小于10^6(默认限制)。
可以使用ticklabel_format()scilimits=参数来更改此默认限制;简单地传递一个格式如下的元组:(low, high),其中刻度的上限应在间隔(10^low, 10^high)内。例如,在以下代码中(一个稍微极端的示例),刻度显示为完整数字,因为np.logspace(0,100)[-1] < 10**101为True。

plt.plot(np.logspace(0, 8), np.logspace(0, 100));
plt.ticklabel_format(scilimits=(0, 101))

相关问题