Пользовательские метки деления в боке со значениями деления с плавающей запятой

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

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

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

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.

Изображение графика Боке, показывающего странную маркировку оси Y

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

Любые предложения по обходным путям?


person moink    schedule 22.01.2019    source источник


Ответы (2)


Как я уже упоминал в комментарии к другому ответу, поведение в вопросе происходит только на моем рабочем компьютере, а не на моем домашнем компьютере. Я не понял, это браузер, версия 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. Я не знаю, насколько это общее решение, то есть будет ли оно работать для произвольных чисел с плавающей запятой, но оно решило мою текущую проблему.

person moink    schedule 23.01.2019

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

введите здесь описание изображения

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)
person Jasper    schedule 22.01.2019
comment
У меня боке 0.13.0. Я не могу выполнить обновление на этом компьютере прямо сейчас, но я попробую на своем домашнем компьютере, когда смогу. - person moink; 22.01.2019
comment
На моем домашнем компьютере 32-битная винда с боке 0.13.0 работает, а на рабочем компьютере 64-битная винда с той же версией боке не работает. - person moink; 22.01.2019
comment
Поправка к моему предыдущему комментарию: и дома, и на работе компы 64-битная винда с боке 0.13.0. У них есть отличия в версии Python и некоторых версиях других библиотек. - person moink; 22.01.2019