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)