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

Python 如何为不同语言设置matplotlib.dates.DateFormatter,python,datetime,matplotlib,Python,Datetime,Matplotlib,我试过了 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')) 但yax

我试过了

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'))
但yaxis标签的绘制方式与00Z07Oct不同,而与00Z0710不同□ (可能是在我的语言环境中绘出的,日语,字符是乱七八糟的。)

另一方面,我试着

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

00z07Oct
这很有效

如何在不同的语言环境中为英语设置matplotlib.dates.DateFormatter?
任何帮助都将不胜感激。

我怀疑这与unicode问题有关,特别是
matplotlib.cbook.unicode\u safe()
。此函数实际上是在
DateFormatter
中运行的,输出为
strftime
。尝试为所有内容设置本地设置,看看是否有帮助:

locale.setlocale(locale.LC_ALL,'en_US')
如果没有,只需定义一个新的
DateFormatter
,它没有
cbook.unicode\u safe()
调用:

return cbook.unicode_safe(dt.strftime(fmt))
替换为:

return dt.strftime(fmt)
插入:

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

在你的身体里

如果这不起作用,请尝试在图形之前定义格式。 例如


谢谢你回答我的问题。不幸的是,您的两种解决方案都不能很好地工作。您知道如何设置matplotlib的默认区域设置吗?很遗憾,这些都不起作用。您确定如果您定义了一个新的
日期格式化程序
,但只有上面提到的不同之处,它就不起作用了吗?根据您的评论,
datetime(2009,10,7,0).strftime(“%Hz%d%b”)
给出了正确的字符串,我认为它是有效的。但遗憾的是,我无法复制您的问题,因此我无法真正检查解决方案是否有效。Matplotlib实际上没有区域设置,但有一个名为
axes.formatter的配置。请使用_locale
,如果
True
将使用系统的区域设置。对于Axis格式化程序(但查看源代码,如果设置了,它似乎对您没有帮助)。是的,我将dates.py中的
cbook.unicode_safe(dt.strftime(fmt))
替换为
dt.strftime(fmt)
。奇怪的是,在其他PC上尝试
locale.setlocale(locale.LC\u ALL,'en\u US')
时,效果很好。当我直接在DateFormatter类代码中编写
locale.setlocale(locale.LC_ALL,'en_US')
时,这在两台电脑上都能很好地工作。我想在
matplotlib
plot的
x轴
中显示
persis
月份。我使用了
locale.setlocale(locale.LC_ALL,'fa_IR')
,但它只是将
georgian
月份的名称从英语改为波斯语,而没有显示
persian
月份名称,即
Jalali
。有什么想法吗?@Shahriar.M您需要类似的东西,但我不知道matplotlib是否可以在内部使用它。也许最简单的解决方案是手动设置格式化程序。它们都不适用于。它们只是用
波斯语
字母表显示月份名称,而不是使用
波斯语
月份名称。
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)