我可以在 matplotlib 条形图中关闭科学记数法吗?

Posted

技术标签:

【中文标题】我可以在 matplotlib 条形图中关闭科学记数法吗?【英文标题】:Can I turn off scientific notation in matplotlib bar chart? 【发布时间】:2019-01-13 02:14:12 【问题描述】:

我有一个条形图,除了 y 轴上的科学记数法之外,它看起来像我想要的样子。

其他一些使用

的解决方案
ax.yaxis.set_major_formatter(tick)

这没有用。另外,我尝试检查这是否是一个偏移问题,但它应该显示一个“+”号,在这种情况下它没有。

每当我使用时:

plt.ticklabel_format(style='plain')

我收到一条错误消息:

Traceback (most recent call last):
  File "C:\Python\lib\site-packages\matplotlib\axes\_base.py", line 2831, in ticklabel_format
    self.xaxis.major.formatter.set_scientific(sb)
AttributeError: 'FixedFormatter' object has no attribute 'set_scientific'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Python/Projects/Kaggle 1.py", line 13, in <module>
    plt.ticklabel_format(style='plain')
  File "C:\Python\lib\site-packages\matplotlib\pyplot.py", line 2982, in ticklabel_format
    useMathText=useMathText)
  File "C:\Python\lib\site-packages\matplotlib\axes\_base.py", line 2856, in ticklabel_format
    "This method only works with the ScalarFormatter.")
AttributeError: This method only works with the ScalarFormatter.

我已经研究过这个 ScalarFormatter,但我不知道为什么它不起作用。我试图在代码中明确包含它,但它不起作用。

我使用的代码是:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv("100 Sales Records.csv")
df_new = df.groupby(['Region']).sum().sort_values("Total Profit", ascending=False)
regions = ('Sub-Saharan Africa', 'Europe', 'Asia', 'Middle East and North Africa', 'Australia and Oceania', 'Central America and the Caribbean', 'North America')
profit = df_new['Total Profit']
y_pos = np.arange(len(profit))

plt.bar(y_pos, profit)
plt.xticks(y_pos, regions)
plt.ticklabel_format(style='plain')
plt.title('Sum of Sales')

plt.show()

图表目前如下所示:

【问题讨论】:

对了,你应该写一个Minimal, Complete, and Verifiable example或者MCVE。您的示例无法粘贴并在其他人的计算机上运行,​​因为它访问了几个不相关的库和数据文件。您应该使用脚本中的少量数据编写一个简短的脚本来展示相同的问题。 见this comment。设置格式时,您应该只将其设置为 y 轴,而不是两者,plt.ticklabel_format(axis="y", style='plain') 【参考方案1】:

您可以使用matplotlib.ticker 中的FuncFormatter 在当前绘图上根据需要更新刻度。在下面的示例中,刻度是使用自定义 scientific_formatter 更新的,我将其定义为使用 2 个精度数字以科学计数法更新刻度 - %2E

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

profit = pd.Series(np.random.randint(1e2, size=5))
ax = profit.plot(kind="bar")

def scientific(x, pos):
    # x:  tick value - ie. what you currently see in yticks
    # pos: a position - ie. the index of the tick (from 0 to 9 in this example)
    return '%.2E' % x

scientific_formatter = FuncFormatter(scientific)
ax.yaxis.set_major_formatter(scientific_formatter)

【讨论】:

好问题。 ax 变量的类型为 matplotlib.axes._subplots.AxesSubplot,因此不再与 pandas 库相关【参考方案2】:

@ImportanceOfBeingErnest 在评论中是正确的。错误是因为 plt.ticklabel_format(style='plain') 默认情况下将两个轴都设置为 plain 而您的 xticks 是自定义的,不能是 plain

使用plt.ticklabel_format(axis="y", style='plain')单独设置y轴。

【讨论】:

以上是关于我可以在 matplotlib 条形图中关闭科学记数法吗?的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 在一张图中绘制多个条形图

Matplotlib 在一张图中绘制多个条形图

如何在 matplotlib 条形图中用希腊符号替换主轴和次轴的图例标签?

科学计算可视化

如何在 matplotlib pandas 的一张图中组合两个文件的两个条形图

来自 Pandas 数据框的 Matplotlib 中堆积条形图中的标签问题