如何修复matplotlib y轴科学计数法显示及ticklabel_format调用报错
问题原因分析
1. 调用ticklabel_format报错的原因
ticklabel_format()方法默认会同时对x、y两个坐标轴生效,但你的x轴是字符串类型的分类标签,使用的是StrCategoryFormatter格式器,该格式器不支持科学计数法相关的配置,只有数值类型轴使用的ScalarFormatter才支持该方法,所以触发了AttributeError。
2. y轴出现科学计数法的原因
matplotlib默认会在单轴数值最大值超过1e6、或者数值跨度过大时,自动启用科学计数法简化刻度显示,你的y轴最大值为1255531刚好超过阈值,所以触发了该规则。
修复方案
最简单的修复方式是调用ticklabel_format()时指定仅对y轴生效,避免触及x轴的分类格式器:
把原来的plt.gca().ticklabel_format(style='plain')替换为:
plt.gca().ticklabel_format(style='plain', axis='y')
如果需要更灵活的刻度配置,也可以手动设置y轴的格式器:
from matplotlib.ticker import ScalarFormatter ax = plt.gca() ax.yaxis.set_major_formatter(ScalarFormatter(useMathText=False)) ax.ticklabel_format(style='plain', axis='y')
修改后可正常运行的完整代码
import matplotlib.pyplot as plt choice = "播放量" # 替换为你自己的choice变量定义 plt.title(f'TOP 10 videos by {choice}') plt.xlabel('TOP places') plt.ylabel(f'Number') labels_top = ['Top10', 'Top9', 'Top8', 'Top7', 'Top6', 'Top5', 'Top4', 'Top3', 'Top2', 'Top1'] y_count = [50235, 90312, 150123, 250000, 290134, 370241, 385153, 768512, 955025, 1255531] for graph in range(len(y_count[:10])): plt.bar(labels_top.pop(), y_count.pop()) # 仅指定y轴关闭科学计数法,不会触发x轴格式器报错 plt.gca().ticklabel_format(style='plain', axis='y') plt.show()
内容的提问来源于stack exchange,提问作者Vitalii Shchudlo
相关产品推荐
相关产品推荐

