You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:38:18