无需修改系统区域设置,将Matplotlib月份标签改为西班牙语
解决Matplotlib图表月份名称西班牙语本地化问题

原代码
import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.cbook as cbook data = cbook.get_sample_data('goog.npz', np_load=True)['price_data'][0:200] fig, ax = plt.subplots(figsize=(10, 7), constrained_layout=True) ax.plot('date', 'adj_close', data=data) # ax.xaxis.set_major_locator(mdates.MonthLocator()) # ax.grid(True) ax.set_ylabel(r'Price [\$]') ax.xaxis.set_major_formatter( mdates.ConciseDateFormatter(ax.xaxis.get_major_locator())) plt.savefig("chart.png")
需求与问题
需要将图表中的英文月份缩写改为西班牙语(例如Dec→Dic、Apr→Abr、Jan→Ene等)。原本可通过locale.setlocale(locale.LC_TIME, 'es_ES')修改系统区域设置实现,但脚本运行在无服务器虚拟机中,无法修改任何系统配置。尝试使用DateFormatter,但它依赖系统区域设置通过strftime获取月份名称,其他格式化工具仅支持数字日期,因此需要找到不依赖系统配置的本地化方法。
解决方案
可以通过自定义月份映射字典,结合ConciseDateFormatter的格式化配置来替换月份名称,无需修改系统区域设置。具体实现代码如下:
import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.cbook as cbook # 定义英文与西班牙语月份缩写的映射关系 es_month_abbr = { 'Jan': 'Ene', 'Feb': 'Feb', 'Mar': 'Mar', 'Apr': 'Abr', 'May': 'May', 'Jun': 'Jun', 'Jul': 'Jul', 'Aug': 'Ago', 'Sep': 'Sep', 'Oct': 'Oct', 'Nov': 'Nov', 'Dec': 'Dic' } def replace_month_to_es(date_str): # 将日期字符串中的英文月份替换为西班牙语 for eng_abbr, es_abbr in es_month_abbr.items(): date_str = date_str.replace(eng_abbr, es_abbr) return date_str data = cbook.get_sample_data('goog.npz', np_load=True)['price_data'][0:200] fig, ax = plt.subplots(figsize=(10, 7), constrained_layout=True) ax.plot('date', 'adj_close', data=data) ax.set_ylabel(r'Price [\$]') # 获取主定位器并初始化ConciseDateFormatter locator = ax.xaxis.get_major_locator() formatter = mdates.ConciseDateFormatter(locator) # 设置各时间维度的格式模板 formatter.formats = [ '%Y', # 年份格式 '%b', # 月份缩写格式 '%d', # 日期格式 '%H:%M', # 时分格式 '%H:%M', # 时分格式 '%S.%f', # 秒毫秒格式 ] # 针对月份维度(索引为1)应用自定义替换逻辑 formatter.formatters[1] = lambda x: replace_month_to_es(f"{x:%b}") ax.xaxis.set_major_formatter(formatter) plt.savefig("chart_es.png")
代码说明
es_month_abbr字典存储了完整的月份缩写对应关系,确保所有英文月份都能被正确替换为西班牙语replace_month_to_es函数负责完成单个日期字符串的月份替换操作- 通过修改
ConciseDateFormatter的formatters列表,精准针对月份显示部分应用自定义逻辑,完全绕过系统locale限制
内容的提问来源于stack exchange,提问作者PerseP
相关产品推荐
相关产品推荐

