У меня проблемы с настройкой языка, на котором ось даты и времени отформатирована в bokeh
.В соответствии с документацией , DatetimeTickFormatter
создает такты времени 'в соответствии с текущей локалью .Однако, какую бы локаль я ни установил в Python, я получаю график, отформатированный на английском языке:
# jupyter notebook
import locale
locale.setlocale(locale.LC_ALL, 'pl')
import random
from datetime import datetime, date
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
from bokeh.models.formatters import DatetimeTickFormatter
output_notebook()
x_values = [datetime(2018, i, 1) for i in range(6, 13)]
y_values = [random.normalvariate(0, 1) for i in range(6, 13)]
p = figure(plot_width=600, plot_height=300,
x_axis_type='datetime', title="test",
x_axis_label='x test', y_axis_label='y test')
p.line(
x=x_values,
y=y_values
)
p.xaxis.formatter = DatetimeTickFormatter(months = '%B')
show(p)
![enter image description here](https://i.stack.imgur.com/h8O0m.png)
Если это актуально, устанавливается глобальная системная локальна en-US
:
PS C:\Users\ppatrzyk> GET-WinSystemLocale
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States)
Я работаю с графиками на нескольких языках, поэтому Мне нужно изменить locale
на лету .Выполнение этого с помощью locale.setlocale
отлично сработало как при печати дат на консоли, так и с matplotlib
.Как я могу установить его в bokeh
, чтобы даты форматировались правильно?
РЕДАКТИРОВАТЬ :
Лучший способ, который я получил, - это построить даты в виде числовой оси (unixотметка времени), а затем используйте major_label_overrides
для замены тиков на правильно отформатированные даты, полученные из datetime.strftime()
в Python.Однако в этом случае масштабирование до отметок между точками данных нарушается, поэтому это далеко не удовлетворительное решение :
x_values = [datetime(2018, i, 1) for i in range(6, 13)]
y_values = [random.normalvariate(0, 1) for i in range(6, 13)]
x_values_timestamp = [int(el.timestamp()) for el in x_values]
x_values_labels = [el.strftime('%B') for el in x_values]
p = figure(plot_width=600, plot_height=300, title="test",
x_axis_label='x test', y_axis_label='y test')
p.xaxis.ticker = x_values_timestamp
p.xaxis.major_label_overrides = dict(zip(x_values_timestamp, x_values_labels))
p.line(
x=x_values_timestamp,
y=y_values
)
show(p)
![enter image description here](https://i.stack.imgur.com/uoROS.png)