У меня небольшая проблема с использованием нескольких рендеров на одном участке в Боке. Если у меня есть два кадра данных
data_week_1
hospitalised_in_other_code sample_datetime rate
A 2019-12-24 1
C 2019-12-22 1
и data_week_2
hospitalised_in_other_code sample_datetime rate
A 2019-12-24 1
Если я создаю тепловую карту с высотой и шириной 1 для обоих средств визуализации, второй рендер будет полностью скрывать первый для (A, 2019-12-24). Моя идея заключалась в том, чтобы создать дополнительный столбец для data_week_2, хранящий высоту глифа rect()
: если есть пара (x, y) общего с data_week_1, я устанавливаю его значение равным 0,5. В противном случае, я оставляю его равным 1, поэтому квадрат фактически занимает весь прямоугольник в тепловой карте, когда присутствует только одна категория.
В таком случае я получаю следующий рисунок, где rect()
глиф нарисован в середине оси категорий: В идеале, я бы хотел, чтобы квадрат reddi sh в нижней части сетки обозначал букву «A», поэтому каждый тип охватывает половину соответствующего квадрата (x, y), если они оба присутствуют: Однако глиф rect()
не принимает параметр смещения, поэтому я не могу поместить его ниже.
Знаете ли вы, есть ли способ, которым я мог бы достичь этого?
Мой код:
daterange = [str(x).split()[0] for x in pd.date_range(datetime(2019,12,22), datetime(2019,12,25))]
buildrange = ["A","B","C"]
p = figure(plot_width=1200, plot_height=1000, title="Patient location from %s to %s"%(daterange[0],daterange[-1]),
x_range=daterange, y_range=buildrange,
x_axis_location="below")
#COMMU
source = ColumnDataSource(data_week_1)
colors = ["#98FB98", "#32CD32", "#228B22"]
mapper = LinearColorMapper(palette=colors, low=data_week_1.rate.min(), high=max(data_week_1.rate.max(),3))
TIPS = [("Date", "@sample_datetime"),
("Unit/Building","@hospitalised_in_other_code"),
("Number of community cases", "@rate")]
r1 = p.rect(x="sample_datetime", y="hospitalised_in_other_code", width=1, height=1, source=source,
line_color='white', fill_color=transform('rate', mapper))
color_bar = ColorBar(color_mapper=mapper, location=(0, 0), ticker=SingleIntervalTicker(interval = 1),
formatter=PrintfTickFormatter(format="%d"), height = 10, width = 75, title = 'Community',
orientation = 'horizontal')
p.add_layout(color_bar, 'above')
p.add_tools(HoverTool(renderers=[r1], tooltips=TIPS))
#NOSO
source = ColumnDataSource(data_week_2)
colors = ["#FFA07A", "#FF0000", "#8B0000"]
mapper = LinearColorMapper(palette=colors, low=data_week_2.rate.min(), high=max(data_week_2.rate.max(),3))
TIPS = [("Date", "@sample_datetime"),
("Unit/Building","@hospitalised_in_other_code"),
("Number of nosocomial cases", "@rate")]
r2 = p.rect(x="sample_datetime", y="hospitalised_in_other_code", width=1, height='height', source=source,
line_color='white', fill_color=transform('rate', mapper))
color_bar = ColorBar(color_mapper=mapper, location=(100, -70), ticker=SingleIntervalTicker(interval = 1),
formatter=PrintfTickFormatter(format="%d"), height = 10, width = 75, title = 'Nosocomial',
orientation = 'horizontal')
p.add_layout(color_bar, 'above')
p.add_tools(HoverTool(renderers=[r2], tooltips=TIPS))
#Customisation of axes
p.axis.axis_line_color = None
p.axis.major_tick_line_color = None
p.axis.major_label_text_font_size = "9pt"
p.axis.major_label_standoff = 0
p.xaxis.major_label_orientation = math.pi/2
p.xgrid.visible = True
p.ygrid.visible = True
p.xaxis.axis_label = 'Date'
p.yaxis.axis_label = 'Code of Unit/building'
# CENTERS THE LABELS AND GRIDS
CS_CODE = """
import {CategoricalTicker} from "models/tickers/categorical_ticker"
export class MyTicker extends CategoricalTicker
type: "MyTicker"
get_ticks: (start, end, range, cross_loc) ->
ticks = super(start, end, range, cross_loc)
# shift the default tick locations by half a categorical bin width
ticks.major = ([x, 0.5] for x in ticks.major)
return ticks
"""
class MyTicker(CategoricalTicker):
__implementation__ = CS_CODE
p.xgrid.ticker = MyTicker()
p.ygrid.ticker = MyTicker()
output_notebook()
output_file("test.html")
show(p)
Приветствия