Пользовательские тиковые метки в Bokeh со значениями тиков с плавающей точкой - PullRequest
0 голосов
/ 22 января 2019

Я хочу сделать " Weibull paper " в Bokeh, что требует от меня сделать пользовательское преобразование по оси Y и добавить соответствующие метки оси Y.

Я следую инструкциям в принятом ответе на этот вопрос stackoverflow: Как использовать пользовательские метки для тиков в Bokeh?

Вот соответствующие пять строк моего кода:

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

Что бы я ожидал: 5 тиков на графике с метками «1», «5», «10», «50» и «99».

Что я получу: 5 тиков на графике с метками «1», «-2,97», «10», «-0,367» и «99». Поэтому некоторые метки изменились так, как я этого хотел, а некоторые остались с их значениями y цифры.

Picture of Bokeh plot showing weird y-axis labelling

Я предполагаю, что это как-то связано с допусками на числа с плавающей запятой или чем-то подобным, тики в словаре не совсем соответствуют тикам на графике. Я был бы согласен с небольшим округлением значений, если бы это решило эту проблему, но я не уверен, к какому допуску я мог бы это сделать и заставить это работать.

Есть предложения по обходным путям?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Как я упоминал в комментарии к другому ответу, поведение в вопросе происходит только на моем рабочем компьютере, а не на моем домашнем компьютере. Я не понял, является ли это браузером, версией Python или некоторыми другими библиотеками, но это не версия Bokeh.

Следующий код не имеет проблемы:

from bokeh.io import output_file, show
from bokeh.plotting import figure
import numpy as np

fig = figure()
fig.circle(x=[5,5,5,5,5], y=[-10,-5,0,1,2], size=10)

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
ytick_loc = np.around(ytick_loc, 15)
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

output_file("test.html")

show(fig)

Конкретная строка, которую я добавил, была:

ytick_loc = np.around(ytick_loc, 15)

Отмечу, что округления до 16 цифр было достаточно для исправления одного из двух тиков с ошибками, но для исправления обоих потребовалось округление до 15. Я не знаю, насколько это общее решение, то есть будет ли оно работать для произвольных чисел с плавающей запятой, но это решило мою текущую проблему.

0 голосов
/ 22 января 2019

Я попробовал ваш код, но не смог воспроизвести вашу проблему. Я использую Bokeh 1.0.4.

enter image description here

from bokeh.io import output_file, show
from bokeh.plotting import figure
import numpy as np

fig = figure()
fig.circle(x=[5,5,5,5,5], y=[-10,-5,0,1,2], size=10)

yticks = np.array([1, 5, 10, 50, 99])
ytick_loc = np.log(np.log(1 / (1 - yticks/100)))
fig.yaxis.ticker = ytick_loc
tick_labels = [str(ytick) for ytick in yticks]
fig.yaxis.major_label_overrides = dict(zip(ytick_loc, tick_labels))

output_file("test.html")

show(fig)
...