【问题标题】:How to set matplotlib.dates.DateFormatter for different languages如何为不同语言设置 matplotlib.dates.DateFormatter
【发布时间】:2013-01-21 15:26:39
【问题描述】:

我试过了

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? 任何帮助将不胜感激。

【问题讨论】:

    标签: python datetime matplotlib


    【解决方案1】:

    我怀疑这与 unicode 问题有关,尤其是 matplotlib.cbook.unicode_safe()。这个函数实际上是在DateFormatter 的输出上运行在strftime 的内部。尝试为所有内容设置本地,看看是否有帮助:

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

    如果没有,只需定义一个没有 cbook.unicode_safe() 调用的新 DateFormatter

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

    替换为:

    return dt.strftime(fmt)
    

    【讨论】:

    • 感谢您回答我的问题。不幸的是,您的两种解决方案都无法正常工作。你知道如何设置 matplotlib 的默认语言环境吗?
    • 很遗憾听到这些都不起作用。你确定如果你定义一个新的DateFormatter 并提到它的唯一区别它不起作用?从你的评论来看,datetime(2009,10,7,0).strftime('%Hz%d%b') 给出了正确的字符串,我认为它有效。但遗憾的是,我无法复制您的问题,因此我无法真正检查解决方案是否有效。 Matplotlib 并没有真正的语言环境,但有一个名为axes.formatter.use_locale 的配置,如果True 将使用系统的语言环境。对于轴格式化程序(但查看源代码,如果设置它似乎对您没有帮助)。
    • 是的,我在 dates.py 中将 cbook.unicode_safe(dt.strftime(fmt)) 替换为 dt.strftime(fmt)。奇怪的是,在其他 PC 上尝试 locale.setlocale(locale.LC_ALL,'en_US') 效果很好。当我直接在 DateFormatter 类代码中编写locale.setlocale(locale.LC_ALL,'en_US') 时,这在两台 PC 上也都运行良好。
    • 我想在我的 matplotlib 情节的 x-axis 中显示 Persian 月份。我使用了locale.setlocale(locale.LC_ALL,'fa_IR'),但它只是将georgian 月份的名称从英文更改为波斯文,而不是显示Persian 月份名称,即Jalali。有什么想法吗?
    • @Shahriar.M 你需要jdatetime 之类的东西,但我不知道matplotlib 是否可以在内部使用它。也许最简单的解决方案是手动设置格式化程序。
    【解决方案2】:

    插入:

    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)
    

    【讨论】:

    • 它们都不适用于my problem。他们只是在 Persian 字母中显示月份名称,而不是使用 Persian 月份名称。
    猜你喜欢
    • 2011-04-30
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多