Как установить язык оси даты и времени в боке? - PullRequest
0 голосов
/ 08 октября 2018

У меня проблемы с настройкой языка, на котором ось даты и времени отформатирована в 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

Если это актуально, устанавливается глобальная системная локальна 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

...