График боке по первой оси y теряет автоматический масштаб при втором y-asix

#bokeh

#боке

Вопрос:

Простой график боке, первая ось y изначально имела автоматическое масштабирование. При добавлении второй оси y изменяется диапазон первой оси y.

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

Следующая программа демонстрирует проблему. Изменение значений в y3 приведет к изменению первого диапазона по оси y.

 from numpy import sin
from bokeh.plotting import output_file, figure, show
from bokeh.models import LinearAxis, Range1d, DataRange1d

x = [p/100 for p in range(0, 320)]
y = sin(x).tolist()

output_file("twin_axis.html")

p = figure()
p.line(x, y, color="red")

x1 = [0, 1.0, 2.2, 3.2]
y3 = [60, 70, 70, 70]  # Changing these values affects first y-axis scale
p.extra_y_ranges = {"Yield": Range1d(start=0, end=50)}  # tried DataRange1d(), no help
p.circle(x=x1, y=y3, color="blue", y_range_name="Yield")
p.add_layout(LinearAxis(y_range_name="Yield", axis_label="Yield(%)"), 'right')

show(p)
  

Я использую bokeh версии v1.0.4.

Ответ №1:

Значение по умолчанию для y_range равно "auto" , поэтому, если вы не укажете какой-либо диапазон, он будет масштабироваться с вашим дополнительным диапазоном. Решение состоит в том, чтобы явно указать y_range для вашего графика, как показано ниже (работает для Bokeh версии v1.0.4)

 from numpy import sin
from bokeh.plotting import output_file, figure, show
from bokeh.models import LinearAxis, Range1d, DataRange1d

x = [p / 100 for p in range(0, 320)]
y = sin(x).tolist()

output_file("twin_axis.html")

p = figure(y_range = Range1d(start = 0, end = 1))
p.line(x, y, color = "red")

x1 = [0, 1.0, 2.2, 3.2]
y1 = [60, 70, 70, 70]  # Changing these values affects first y-axis scale
p.extra_y_ranges = {"Yield": Range1d(start = 0, end = 50)}  # tried DataRange1d(), no help
p.circle(x = x1, y = y1, color = "blue", y_range_name = "Yield")
p.add_layout(LinearAxis(y_range_name = "Yield", axis_label = "Yield(%)"), 'right')

show(p)
  

Результат:

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