#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)
Результат: