Repository navigation
Description
Bug summary
-
Date formatting using
strftimeformat codes should use the current locale's names. While this works as expected on Linux,ConciseDateFormatterby default shows English month names etc. when running on a non-English locale. It only works correctly after explicitly setting the locale to the current one bylocale.setlocale(locale.LC_ALL, ''). -
Setting
axes.formatter.use_localetoTruedoesn't have any effect on Windows unless you explicitly set the locale to the current one bylocale.setlocale(locale.LC_ALL, '')(again, it works correctly on Linux). I don't understand why this is so as__init__does exactly the same thing but for some reason without effect on Windows:
matplotlib/lib/matplotlib/__init__.py
Lines 972 to 973 in f5ff5d7
if rcParams['axes.formatter.use_locale']: locale.setlocale(locale.LC_ALL, '')
Code for reproduction
import locale
import platform
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
dates = np.arange(np.datetime64('2022-12-01'), np.datetime64('2022-12-02'), np.timedelta64(1, 'h'))
values = np.zeros_like(dates, dtype=int)
def plot(title):
fig, ax = plt.subplots(figsize=(6, 1.5), layout='constrained')
ax.plot(dates, values, 'white')
ax.xaxis.set_major_formatter(mpl.dates.ConciseDateFormatter(mpl.dates.AutoDateLocator()))
ax.text(.5, .5,
f"{locale.getlocale() = }\n{ax.yaxis.get_major_formatter().get_useLocale() = }\n({platform.system()})",
transform=ax.transAxes, ha='center', va='center')
ax.set_title(title)
fig.savefig(title + '.png')
# use \N{MODIFIER LETTER COLON} instead of regular colon for Windows file names
plot('1꞉ default')
with mpl.rc_context({'axes.formatter.use_locale': True}):
plot('2꞉ axes.formatter.use_locale = True')
locale.setlocale(locale.LC_ALL, '')
plot("3꞉ setlocale(locale.LC_ALL, '')")
with mpl.rc_context({'axes.formatter.use_locale': True}):
plot("4꞉ axes.formatter.use_locale = True after setlocale(locale.LC_ALL, '')")Actual outcome
On Windows:
1꞉ default--> should be Dez instead of Dec
2: axes.formatter.use_locale = True --> should be 0,00 instead of 0.00
3: after setlocale(locale.LC_ALL, '') --> this works correctly
4: axes.formatter.use_locale = True after setlocale(locale.LC_ALL, '') --> this works correctly too
Expected outcome
On Linux
All four cases are correct. The expected outcome on Windows is the same as on Linux.
Additional information
The issue is only on Windows, everything is fine on Linux (can't test it on MacOS but I suppose it'd be the same as on Linux).
Operating system
Windows
Matplotlib Version
3.6.3
Matplotlib Backend
No response
Python version
3.10
Jupyter version
No response
Installation
conda








Activity
StefRe commentedon Jan 16, 2023
As a side note, the Formatting date ticks using ConciseDateFormatter example incorrectly speaks about localization where it must read customization: Python's
strftimeformat codes always use the locale's names for days, months etc. so there is neither the necessity nor the possibility of a localization in matplotlib. If you want to localize the names you must set the locale accordingly, you can't do it by changing the formatter's formats.StefRe commentedon Jan 31, 2023
I found the culprit: this has nothing to do with Windows or Linux but with the Gtk backend. Using any Gtk backend sets the locale to the user's default setting (same as
locale.setlocale(locale.LC_ALL, '')).Running
with the following
use_backend.py:gives the following output (Windows 10):
@oscargus: could you remove the "OS: Microsoft" tag, please.
I don't have a Mac so maybe someone can run the above on MacOS, just for completeness.
StefRe commentedon Jan 31, 2023
Regarding using locale number and date formatting in matplotlib:
rcParams['axes.formatter.use_locale']parameter doesn't work as one would expect: it only has any effect (sets the locale) when set in the config file (see here); later changes directly to thempl.rcParamsor using thempl.rc_contextcontext manager have no effect as they don't trigger the setting of the locale. As solution could be to move thesetlocalecall from matplotlib's__init__to__setitem__ofRcParams.rcParams['axes.formatter.use_locale']toTruein the config file also effects date formatting (%a,%A,%b,%B,%c,,%x,%X). This should be documented.Cwhen using anyGtkbackend to be consitent with other backends, although this is a breaking API change. If we don't want to do this for backward compatibility reasons the specific behaviour of theGtkbackends with regard to locales should be documented.Localization of date formatsexample (see comment above: [Bug]: Current locale not honored on Windows #25006 (comment))Any thoughts, in particular to 3. and 1.?
anntzer commentedon Jan 31, 2023
Point 1. (using
__setitem__) seems reasonable.Regarding 3., our longstanding policy has been that if a GUI toolkit resets the locale, we should not undo that ourselves; see #6706 and the various linked issues.
tacaswell commentedon Jan 31, 2023
Agree on 1 that moving this
__setitem__is a good idea.Agree on 2 that it is worth pointing out the full extent of this setting.
On 3, I also agree with @anntzer that if the GUIs are doing things we should not get in the way at the backend level. A way my thinking has changed a bit from 2016 is that there might be a case for forcing the locale in
pyplot. We (I) have started to think ofpyplotas our "application" so doing work there to make the behavior consistent is probably reasonable (if you do not want us to "help", do not import pyplot!).mironleon commentedon Apr 9, 2026
I'm also running into this bug. If I run the script from the comment above, I get the following
qtaggis the default backend on my machine.Which means in our scientific simulation library, a script can fail if it includes a matplotlib plotting call, since that changes the locale and afterwards we use tinyexpr (via Cython) to parse an expression. This program is locale dependent and only really works with the C numeric locale.
If anyone can give some pointers, I'd be happy to try and fix this, since it is a very annoying an subtle bug