如何使 y 轴上的数字显示以百万为单位的值,而不是 matplotlib 中的科学记数法?

How do I make the numbers on the y-axis show values in millions instead of in scientific notation in matplotlib?

如何更改 y 轴上的数字以显示 0 到 1700 万而不是 0 到 1.75 1e7?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import pingouin as pg
import plotly
import plotly.express as px
data = pd.read_csv('COVID19_state.csv')
fig, ax = plt.subplots(figsize=(12,5))
ax = sns.barplot(x = 'State', y = 'Tested', data = data, color='blue');
ax.set_title('Tested by State')
ax.set_xticklabels(labels=data['State'], rotation=90)
ax.set_ylabel('Tested')
ax.set_xlabel('State')
plt.grid()
plt.show()

输出:

我找到了两个选项,第一个获取默认值 matplotlib.ticker.ScalarFormatter 并关闭科学记数法:

fig, ax = plt.subplots()
ax.yaxis.get_major_formatter().set_scientific(False)
ax.yaxis.get_major_formatter().set_useOffset(False)
ax.plot([0, 1], [0, 2e7])

第二种方法定义了一个自定义格式化程序,它除以 1e6 并附加“百万”:

from matplotlib.ticker import NullFormatter

def formatter(x, pos):
    return str(round(x / 1e6, 1)) + " million"

fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(formatter)
ax.yaxis.set_minor_formatter(NullFormatter())
ax.plot([0, 1], [0, 2e7])

我在 ScalarFormatter 中找不到将 1e6 替换为“million”的方法,但我确信 matplotlib 中有一种方法可以让您在需要时执行此操作。


编辑:使用 ax.text:

from matplotlib.ticker import NullFormatter

def formatter(x, pos):
    return str(round(x / 1e6, 1))

fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(formatter)
ax.yaxis.set_minor_formatter(NullFormatter())
ax.plot([0, 1], [0, 2e7])
ax.text(0, 1.05, "in millions", transform = ax.transAxes, ha = "left", va = "top")

当然,如果您已经有了标签,那么将其包含在那里可能更有意义,至少我会这样做:

from matplotlib.ticker import NullFormatter

def formatter(x, pos):
    return str(round(x / 1e6, 1))

fig, ax = plt.subplots()
ax.yaxis.set_major_formatter(formatter)
ax.yaxis.set_minor_formatter(NullFormatter())
ax.plot([0, 1], [0, 2e7])
ax.set_ylabel("interesting_unit in millions")

如果您确定您的数据已经以百万为单位并且在 1e-41e5 之间(在此范围之外 scientific notation will kick in),您可以省略设置格式化程序的整个部分在最后两种方法中,只需将 ax.text(0, 1.05, "in millions", transform = ax.transAxes, ha = "left", va = "top")ax.set_ylabel("interesting_unit in millions") 添加到您的代码中。您仍然需要为其他两种方法设置格式化程序。