Как связать (t, x) сюжет и (x, y) сюжет в боке? - PullRequest
0 голосов
/ 21 марта 2019

Я измеряю две переменные, x и y, как функцию времени t. Я визуализирую это с помощью Bokeh, на графиках рассеяния x и y как функции t и на третьем графике рассеяния y как функции x. Я бы хотел, чтобы масштаб графика (x, y) соответствовал масштабу первых двух графиков. Это то, что у меня есть

import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
from bokeh.layouts import gridplot

t = pd.date_range('2018-01-01', periods=10, freq='H')
x = np.linspace(0, 5, len(t))
y = x**2
source = ColumnDataSource({'t': t, 'x': x, 'y': y})
tools = "pan, box_select, box_zoom, reset"


p1 = figure(tools=tools, x_axis_type='datetime')
p1.scatter(x='t', y='x', source=source)
p2 = figure(tools=tools, x_axis_type='datetime')
p2.x_range = p1.x_range
p2.scatter(x='t', y='x', source=source)
p3 = figure(tools=tools)
p3.scatter(x='x', y='y', source=source)
p = gridplot([[p1, p2, p3]])
show(p)

При увеличении p1, p2 «следует» (и наоборот). Есть ли способ заставить p3 следовать, чтобы p3 показывал только те точки данных, которые показаны в p1 и p2?

1 Ответ

0 голосов
/ 22 марта 2019

Вы можете добавить дополнительную ось X, как в этом коде (Bokeh v1.0.4).Или, если хотите, вы можете использовать время для главной оси на 3-м графике.

import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, LinearAxis, DatetimeTickFormatter
from bokeh.models.tickers import YearsTicker
from bokeh.layouts import gridplot

t = pd.date_range('2018-01-01', periods = 10, freq = 'H')
x = np.linspace(0, 5, len(t))
y = x ** 2
source = ColumnDataSource({'t': t, 'x': x, 'y': y})
tools = "pan,box_select,box_zoom,reset,wheel_zoom"

p1 = figure(tools = tools, x_axis_type = 'datetime', active_scroll = 'wheel_zoom')
p1.scatter(x = 't', y = 'x', source = source)

p2 = figure(tools = tools, x_axis_type = 'datetime')
p2.x_range = p1.x_range
p2.scatter(x = 't', y = 'x', source = source)

p3 = figure(tools = tools)
p3.extra_x_ranges = { "Time": p1.x_range }  # y_range_name = "Volume",
extra_x_axis = LinearAxis(x_range_name = "Time", ticker = YearsTicker())
extra_x_axis.formatter = DatetimeTickFormatter( days = ["%m/%d %H:%M"],
                                                months = ["%m/%d %H:%M"],
                                                hours = ["%m/%d %H:%M"],
                                                minutes = ["%m/%d %H:%M"])
p3.add_layout(extra_x_axis, place = 'below')
p3.scatter(x = 'x', y = 'y', x_range_name = "Time", source = source)

layout = gridplot([[p1, p2, p3]])

show(layout)

Результат:

enter image description here

...