在Pandas DataFrame生成的pyplot表格中保持科学计数法格式一致
问题根因
你当前的问题是因为传入ax.table()的是float类型数值,Matplotlib会自动根据数值大小选择展示格式,Pandas的打印配置仅作用于Pandas自身的输出,无法控制Matplotlib的表格渲染逻辑。
可行解决方案
方案1:排序完成后再格式化数值为字符串(最简便)
你可以先保留数值类型完成排序,排序后再将数值列格式化为统一的科学计数法字符串,直接传入字符串给Matplotlib表格即可避免自动格式转换:
import pandas as pd import matplotlib.pyplot as plt values = [] for item in scenarios: value = dataframe.loc[dataframe['Scenario'] == item, 'Value'].sum() # 先存原始数值用于排序 values.append(value) visual_data = pd.DataFrame(scens, columns=["Scenario"]) visual_data["Data"] = values # 用原始数值排序 visual_data.sort_values(by=['Data'], inplace=True) # 排序完成后再统一格式化为科学计数法字符串 visual_data["Data"] = visual_data["Data"].apply(lambda x: "{:.2e}".format(x)) # Matplotlib代码无需改动,传入的已经是格式化好的字符串 fig, ax = plt.subplots() ax.axis('off') ax.axis('tight') table = ax.table(cellText=visual_data.to_numpy(), colLabels=visual_data.columns, loc='center', cellLoc='center') fig.tight_layout() plt.show()
方案2:通过Matplotlib表格对象设置单元格格式
如果需要保留数值类型不转字符串,可以在生成表格后遍历数值列的单元格,统一设置显示格式:
# 原有生成visual_data、排序的代码不变,传入float类型数值 fig, ax = plt.subplots() ax.axis('off') ax.axis('tight') table = ax.table(cellText=visual_data.to_numpy(), colLabels=visual_data.columns, loc='center', cellLoc='center') # 遍历第二列(数值列)的所有单元格,设置科学计数法格式 for row in range(1, len(visual_data)+1): # 跳过表头行 cell = table[(row, 1)] # 1对应Data列的索引 cell.get_text().set_text("{:.2e}".format(float(cell.get_text().get_text()))) fig.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者P. Monroe
相关产品推荐
相关产品推荐

