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

Я хочу сделать «Бумага Вейбулла» в боке, что требует от меня пользовательского преобразования по оси 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.

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я попробовал ваш код, но не смог воспроизвести вашу проблему. Я использую Боке 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)

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

moink 22.01.2019 15:54

На моем домашнем компьютере 32-битная винда с боке 0.13.0 работает, а на рабочем компьютере 64-битная винда с той же версией боке не работает.

moink 22.01.2019 21:04

Поправка к моему предыдущему комментарию: и дома, и на работе компы 64-битная винда с боке 0.13.0. У них есть отличия в версии Python и некоторых версиях других библиотек.

moink 22.01.2019 21:48
Ответ принят как подходящий

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

Другие вопросы по теме