如何在matplotlib对数坐标图中去除科学计数法

27

我知道这个问题以前已经被问过了,但我尝试了所有可能的解决方案,而且没有一个解决了我的问题。

所以,我在matplotlib中有一个log-log的图,我想避免x轴上的科学计数法。

这是我的代码:

from numpy import array, log, pi
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import matplotlib.ticker as mticker

plt.rc('axes.formatter', useoffset=False)

tc = array([7499680.0, 12508380.0, 23858280.0, 34877020.0, 53970660.0, 89248580.0, 161032860.0, 326814160.0, 784460200.0])

theta = array([70, 60, 50, 45, 40, 35, 30, 25, 20])

plt.scatter(theta,tc)

ax=plt.gca()

ax.set_xscale('log')
ax.set_yscale('log')

ax.xaxis.set_major_formatter(mticker.ScalarFormatter())
ax.xaxis.get_major_formatter().set_scientific(False)
ax.xaxis.get_major_formatter().set_useOffset(False)

plt.show()

这是输出结果:

Output

从图中可以看出,在x轴上的数字仍然以科学计数法表示。我想将它们显示为20、30、40……我尝试了各种可能的解决方案,但都没有结果。

非常感谢每个愿意帮助我的人。

注:我不能使用plt.loglog()命令,因为我正在对数据进行一些曲线拟合,并且我需要它保持原样。

注2:我注意到一个非常奇怪的事情发生了:如果我将代码更改为yaxis.get_mayor_formatter()……,它在y轴上有效!只有在x轴上它才不起作用。这怎么可能呢?

编辑:也许不太清楚,但是如果您查看代码,会发现有三种方法应该影响x刻度的显示:plt.rc('axes.formatter', useoffset=False)ax.xaxis.set_major_formatter(mticker.ScalarFormatter())ax.xaxis.get_major_formatter().set_scientific(False)。根据我找到的资料,它们都应该单独起作用,但实际上它们并没有。当然,我也尝试了一个接一个地使用它们,而不是全部同时使用。

4个回答

27

这些是 X 轴上的次要刻度(即它们不在10的整数幂上), 而不是主要刻度. matplotlib 会自动确定是否应该标注主要或次要刻度 - 在这种情况下, 因为您在 x 范围内没有显示任何主要刻度, 所以正在标记次要刻度。因此,您需要使用 set_minor_formatter 方法:

ax.xaxis.set_minor_formatter(mticker.ScalarFormatter())

输入图像描述

它在y轴上正常工作的原因是因为这些刻度是主刻度(即在10的整数次幂上),而不是副刻度。


(这可以替换问题中的其他3个“ax.xaxis”语句。) - Max Ghenis
我仍然有问题,即数据点跨越一个数量级:https://dev59.com/0TIBtIcB2Jgan1zndkrg - Max Ghenis
1
你可能是指 set_major_formatter。你也可以使用 mticker.FormatStrFormatter('%d') 来得到 1 而不是 1.0 - Suuuehgi
@tmdavison 这是关于你的回答。 - Suuuehgi
@Suuuehgi 好的,那我不明白你在说什么。这绝对不是需要主要格式化程序的情况。如果您查看x轴,您会发现刻度线都是次要刻度线,因为它们位于对数比例尺上的10的整数幂之间。此外,虽然您建议使用FormatStrFormatter,但我使用的ScalarFormatter显然已经足够,如我所附的图像所示。 - tmdavison
由于某种原因,每个大刻度大于或等于1的都以“.0”结尾(即“1.0”,“10.0”,“100.0”等),这感觉是不必要的,因为它们都是整数,而小刻度则没有。您有任何想法为什么会出现这种情况,或者如何使它们不以“.0”结尾吗? - HelloGoodbye

13
以下内容可作为解决办法使用(原回答):
from matplotlib.ticker import StrMethodFormatter, NullFormatter
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:.0f}'))
ax.yaxis.set_minor_formatter(NullFormatter())

0
如果你想要设置 x 轴不再使用科学计数法,你需要更改格式化程序,然后可以将其设置为 plain。
ax.xaxis.set_minor_formatter(mticker.ScalarFormatter())
ax.ticklabel_format(style='plain', axis='x')

-3
如果您想禁用偏移量和科学计数法,可以使用 ax.ticklabel_format(useOffset=False, style='plain')

4
无效。我收到一个错误:"AttributeError:此方法仅适用于ScalarFormatter"。 - Tropilio
这很奇怪,因为你正在使用它。 - Aditya
11
我知道,这就是为什么我要问这个问题的原因。 - Tropilio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接