Боке - смещение глифа, когда два рендера перекрываются - PullRequest
0 голосов
/ 24 января 2020

У меня небольшая проблема с использованием нескольких рендеров на одном участке в Боке. Если у меня есть два кадра данных

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() глиф нарисован в середине оси категорий: enter image description here В идеале, я бы хотел, чтобы квадрат reddi sh в нижней части сетки обозначал букву «A», поэтому каждый тип охватывает половину соответствующего квадрата (x, y), если они оба присутствуют: enter image description here Однако глиф 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)

Приветствия

...