Я хочу сделать «Бумага Вейбулла» в боке, что требует от меня пользовательского преобразования по оси 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.
Я предполагаю, что это как-то связано с допусками на числа с плавающей запятой или что-то в этом роде, с отметками в словаре, которые не совсем соответствуют отметкам на графике. Я был бы согласен с очень небольшим округлением значений, если бы это решило эту проблему, но я не уверен, с каким допуском я мог бы это сделать, и это сработало.
Любые предложения по обходным путям?
Я попробовал ваш код, но не смог воспроизвести вашу проблему. Я использую Боке 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)
На моем домашнем компьютере 32-битная винда с боке 0.13.0 работает, а на рабочем компьютере 64-битная винда с той же версией боке не работает.
Поправка к моему предыдущему комментарию: и дома, и на работе компы 64-битная винда с боке 0.13.0. У них есть отличия в версии Python и некоторых версиях других библиотек.
Как я уже упоминал в комментарии к другому ответу, поведение в вопросе происходит только на моем рабочем компьютере, а не на моем домашнем компьютере. Я не понял, это браузер, версия 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.13.0. Я не могу выполнить обновление на этом компьютере прямо сейчас, но я попробую на своем домашнем компьютере, когда смогу.