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

无需修改系统区域设置,将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:01:03