如何在Matplotlib Pyplot图表中设置空格千位分隔符
解决Matplotlib图表Y轴千位空格分隔符的学术格式需求
我用Pyplot绘制学术图表,Y轴最大值达175000,需要符合学术规范:用空格作为千位分隔符,且已通过rc配置启用LaTeX和衬线字体。尝试把DataFrame所有整数转成带逗号分隔符再替换为空格的字符串后,图表无法生成,内核一直运行无输出。需要可行方案,优先支持一键应用到整个DataFrame的方法,也接受其他解决方案。
现有配置与绘图代码
import numpy as np import pandas as pd from matplotlib import pyplot as pp %matplotlib inline from matplotlib import rc rc("text", usetex=True) rc("font", family="serif") sketsverhouding = 4 / 5 vol = 5, 5*sketsverhouding half = 3, 3*sketsverhouding derde = 2.3, 2.3*sketsverhouding
导致绘图失败的DataFrame处理代码
data = pd.read_excel(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\xrd\sifeksp_filament.xlsx", sheet_name = "python_data") data = data.applymap(lambda x: f'{x:,d}' if isinstance(x, int) else x)
正常绘图但无千位分隔符的代码
data = pd.read_excel(r"C:\Users\pivde\Desktop\Tuks\nagraads\karakterisering\xrd\sifeksp_filament.xlsx", sheet_name = "python_data")
绘图函数
def skets(y, etiket): pp.figure(figsize=half) pp.plot(data['2theta'], data[y], 'k-') pp.xlabel(r'2$\theta$ [$^\circ$]') pp.ylabel('Intensity') pp.tight_layout() pp.ylim(0, 15000) pp.savefig(naam.format(etiket)) naam = 'grafieke/xrd_sifekpsfil_{:03.0f}ldh_pla.svg' skets('n', 0) skets('t', 2)
简化测试数据集
2theta = [4.998436247,10.63245752,20.27627772,30.37691046,40.62981404,50.83196067,61.08486426,70.01808718] n = [6090,1387,6762,3178,2865,2121,1354,1243] t = [6146,2266,8610,4012,3424,2390,1572,1355]
解决方案
方法1:直接修改Matplotlib刻度格式(推荐,无需修改DataFrame)
不需要改动DataFrame的数据类型,直接在绘图时设置Y轴刻度的格式化器,用LaTeX的千位分隔符格式(空格分隔),完美适配学术规范:
修改绘图函数,添加Y轴刻度格式化代码:
from matplotlib.ticker import FuncFormatter def skets(y, etiket): pp.figure(figsize=half) pp.plot(data['2theta'], data[y], 'k-') pp.xlabel(r'2$\theta$ [$^\circ$]') pp.ylabel('Intensity') # 设置Y轴千位空格分隔符 def format_y_tick(value, pos): # 用LaTeX格式输出带空格的千位分隔符 return r'{:,.0f}'.format(value).replace(',', r'\,') pp.gca().yaxis.set_major_formatter(FuncFormatter(format_y_tick)) pp.tight_layout() pp.ylim(0, 15000) pp.savefig(naam.format(etiket))
方法2:安全修改DataFrame(保留数值类型,仅显示格式化)
如果一定要修改DataFrame,不要把数值转成字符串(会导致绘图时无法识别为数值),可以用以下两种方式:
- 全局显示格式设置:仅改变控制台显示效果,不修改数据类型
pd.options.display.float_format = lambda x: '{:,.0f}'.format(x).replace(',', ' ') - 添加格式化列:保留原数值列用于绘图,新增字符串列用于查看
data['n_formatted'] = data['n'].apply(lambda x: '{:,.0f}'.format(x).replace(',', ' ')) data['t_formatted'] = data['t'].apply(lambda x: '{:,.0f}'.format(x).replace(',', ' '))
错误原因说明
之前的代码把DataFrame的整数转成了字符串,Matplotlib绘图时无法将字符串解析为数值,导致内核持续运行无输出。必须保持数据为数值类型,仅修改显示格式而非数据本身。
内容的提问来源于stack exchange,提问作者Philip de Bruin
相关产品推荐
相关产品推荐

