如何为不同语言设置matplotlib.dates.DateFormatter

4 投票
2 回答
2766 浏览
提问于 2025-04-17 13:18

我试过

import locale
locale.setlocale(locale.LC_TIME,'en_US')
tyme = [datetime(2009,10,6,12) + timedelta(hours=6*i) for i in range(5)]
plt.contour(x, tyme, data)
ax=plt.gca()
ax.yaxis.set_major_formatter(matplotlib.dates.DateFormatter('%Hz%d%b'))

但是y轴的标签显示得不对,变成了00Z0710□(可能是因为我使用的是日语环境,所以字符显示乱码了)。

另一方面,我还试过

 import locale
 locale.setlocale(locale.LC_TIME,'en_US')
 print datetime(2009,10,7,0).strftime(''%Hz%d%b)

结果是

00z07Oct

这个效果很好。

我该如何在不同语言环境下设置matplotlib.dates.DateFormatter为英文呢?任何帮助都非常感谢。

2 个回答

1

插入:

locale.setlocale(locale.LC_TIME,'en_US')

或者:

locale.setlocale(locale.LC_ALL, "en_GB.utf8")

放在你的图形里面。

如果这样还不行,试着在图形之前定义格式。比如:

import locale
dfmt = dates.DateFormatter('%Hz%d%b')
...
locale.setlocale(locale.LC_ALL, "en_GB.utf8")
ax.yaxis.set_major_formatter(dfmt)
2

我怀疑这个问题和unicode有关,特别是 matplotlib.cbook.unicode_safe() 这个函数。这个函数实际上是在 DateFormatter 中运行的,处理的是 strftime 的输出。你可以尝试把所有的本地设置都调整一下,看看是否能解决问题:

locale.setlocale(locale.LC_ALL,'en_US')

如果这样还是不行,那就定义一个新的 DateFormatter,这个新的版本里不调用 cbook.unicode_safe()

return cbook.unicode_safe(dt.strftime(fmt))

替换成:

return dt.strftime(fmt)

撰写回答