【问题标题】:How can I use matplotlib ticklabel_format to not use scientific notation on y axis labels如何使用 matplotlib ticklabel_format 在 y 轴标签上不使用科学记数法
【发布时间】:2020-03-30 01:44:23
【问题描述】:

我正在创建一个绘图(在 colab 工作表中)并希望 y 刻度标签不使用科学记数法。 ticklabel_format 对最终图形没有任何影响。 y 轴标签仍显示为 10^3 而不是 1000。如何格式化 y 刻度标签以不使用科学记数法? 这是我的代码

import matplotlib.pyplot as plt
plt.ticklabel_format(style='plain', axis='y')
plt.plot(Cd_rank,Cd_raw,linewidth=4)
plt.plot(Cd_rank,Cd_sed,linewidth=4)
plt.plot(Cd_rank,Cd_filter,linewidth=4)
plt.plot([0,1],[0.3,0.3],linewidth=4)
plt.plot([0,1],[5,5],linewidth=4)
plt.ylabel('Turbidez (UTN)')
plt.xlabel('Datos ordenados')
plt.yscale('log')
plt.legend(['Agua cruda','Decantada','Filtrada','Norma EPA','Norma ENACAL'])

【问题讨论】:

  • plt.gca().yaxis.set_major_formatter( matplotlib.ticker.ScalarFormatter())
  • 我收到此错误:AttributeError: module 'matplotlib.pyplot' has no attribute 'ticker'。我用 plt 替换了 matplotlib。
  • 好吧,你需要matplotlib.ticker,因为plt.ticker不存在。添加import matplotlib(同时保留import matplotlib.pyplot as plt)。
  • 我已经添加了 matplotlib 导入。谢谢!我假设我需要添加类似plt.gca().yaxis.set_major_formatter( matplotlib.ticker.ScalarFormatter(style='plain', axis='y')) 的内容,因为plt.gca().yaxis.set_major_formatter( matplotlib.ticker.ScalarFormatter()) 似乎没有做任何事情。我怀疑我遗漏了一些明显的东西。

标签: matplotlib


【解决方案1】:

ScalarFormatter 以默认格式显示刻度标签。请注意,根据您的具体情况,matplotlib 仍可能使用科学记数法:

  • 当数字太高时(默认约为 4 位)。 set_powerlimits((n, m)) 可用于更改限制。

  • 如果数字非常接近,matplotlib 使用偏移量来描述范围。该偏移量位于轴的顶部。这可以通过格式化程序的useOffset=None 参数来抑制。

  • 在某些对数刻度的情况下,主要刻度很少。然后一些(但不是全部)次要刻度也会得到一个标签。同样对于这些,可以更改格式化程序。一个问题可能是一个简单的ScalarFormatter 会设置太多标签。要么使用NullFormatter 抑制所有这些次要标签,要么您需要一个非常自定义的格式化程序,它为需要抑制的次要刻度标签返回空字符串。

一个简单的例子:

from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np

N = 50
Cd_rank = np.linspace(0, 100, N)
Cd_raw = np.random.normal(1, 20, N).cumsum() + 100

plt.plot(Cd_rank, Cd_raw, linewidth=4)
plt.plot([0, 1], [0.3, 0.3], linewidth=4)
plt.plot([0, 1], [5, 5], linewidth=4)
plt.yscale('log')
plt.gca().yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.gca().yaxis.set_minor_formatter(ticker.NullFormatter())
plt.show()

这里有一个更复杂的例子,有次要(绿色)和主要(红色)刻度。

from matplotlib import pyplot as plt
from  matplotlib import ticker
import numpy as np

N = 50
Cd_rank = np.linspace(0, 100, N)
Cd_raw = np.random.normal(10, 5, N).cumsum() + 80

plt.plot(Cd_rank, Cd_raw, linewidth=4)
plt.yscale('log')
mticker = ticker.ScalarFormatter(useOffset=False)
mticker.set_powerlimits((-6, 6))
ax = plt.gca()
ax.yaxis.set_major_formatter(mticker)
ax.yaxis.set_minor_formatter(mticker)
ax.tick_params(axis='y', which='major', colors='crimson')
ax.tick_params(axis='y', which='minor', colors='seagreen')
plt.show()

PS:当刻度涉及大于 1 和小于 1 的 10 的幂(例如,100, 10, 1, 0.1, 0.01)时,ScalarFormatter 不会很好地显示小于 1 的数字(它会显示 0.10.010)。在这种情况下,可以使用 StrMethodFormatter 代替:

plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter("{x}"))

【讨论】:

  • 太棒了!如何让 matplotlib 为小于 1 的数字显示正确的位数?它当前显示 0 而不是 0.1?或者我应该把它作为一个不同的问题发布?看到这个代码N = 50Cd_rank = np.linspace(0, 1, N)Cd_raw = np.logspace(-2,3,N)np.random.normal()plt.plot(Cd_rank, Cd_raw, linewidth=4)plt.plot([0, 1], [0.3, 0.3], linewidth=4)plt.plot([0, 1], [5, 5], linewidth=4)plt.yscale('log')plt.gca().yaxis.set_major_formatter(ticker.ScalarFormatter())plt.gca().yaxis.set_minor_formatter(ticker.NullFormatter())plt.show()
  • 是的!这太棒了!
【解决方案2】:

这是关闭科学记数法并正确处理小于 1 的数字的代码。感谢@Johanc 提供此代码。

from matplotlib import pyplot as plt
from matplotlib import ticker
import numpy as np

N = 50
x = np.linspace(0,1,N)
y = np.logspace(-3, 2, N)

plt.plot(x, y, linewidth=4)
plt.yscale('log')
plt.ylim(bottom=0.001,top=100)
plt.gca().yaxis.set_major_formatter(ticker.ScalarFormatter())
plt.gca().yaxis.set_major_formatter(ticker.StrMethodFormatter("{x}"))
plt.show()```

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 2018-10-13
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2016-08-15
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多