散景颜色条,为每种颜色分配一个刻度

Bokeh colorbar, assign a tick to each color

我正在尝试绘制包含一些计数的矩阵的热图(在我的代码中称为 mat,然后在更改结构以将其与 Bokeh 一起使用后 df)。结构是这样的:

X element 1 element 2 element 3
category 1 0 6 4
category 2 1 7 3
category 3 5 2 10
category 4 0 1 4

现在在我的代码中,我将 df.value.unique() 用于颜色映射器和刻度线,但在热图中,颜色条的刻度线与颜色不对应:

如何使刻度线的颜色一一对应?我很确定我必须使用 CategoricalColorMapper 但我只得到一个白色屏幕。感谢您的帮助。 这是我的代码:

mat = pd.read_csv("tests/count_50.dat", sep="\t", index_col=0)

mat.index.name = 'MGI_id'
mat.columns.name = 'phen_sys'

#set data as float numbers
mat=mat.astype(float)

#Create a custom palette and add a specific mapper to map color with values
df = mat.stack(dropna=False).rename("value").reset_index()

pal=bokeh.palettes.brewer['YlGnBu'][len(df.value.unique())]
mapper = LinearColorMapper(palette=pal, low=df.value.min(), high=df.value.max(), nan_color = 'gray')

#Define a figure
p = figure(
    plot_width=1280,
    plot_height=800,
    title="Heatmap",
    x_range=list(df.MGI_id.drop_duplicates()),
    y_range=list(df.phen_sys.drop_duplicates()[::-1]),
    tooltips=[('Phenotype system','@phen_sys'),('Gene','@MGI_id'),('Phenotypes','@value')],
    x_axis_location="above",
    output_backend="webgl")

#Create rectangles for heatmap
p.rect(
    x="MGI_id",
    y="phen_sys",
    width=1,
    height=1,
    source=ColumnDataSource(df),
    fill_color=transform('value', mapper))
p.xaxis.major_label_orientation = 45
#Add legend
t = df.value.unique()
t.sort()
color_bar = ColorBar(
    color_mapper=mapper,
    ticker=FixedTicker(ticks=t, desired_num_ticks=len(df.value.unique())),
    label_standoff=6,
    border_line_color=None)
p.add_layout(color_bar, 'right')

show(p)

您的值列表从 0 到 10,因此 ColorBar 将增加到 10。您可以将映射器 'high' 的值更改为“9”:

mapper = LinearColorMapper(palette=colors, low=0, high=9, nan_color = 'gray')

或者从 1 到 10 的 ColorBar:

mapper = LinearColorMapper(palette=colors, low=1, high=10, nan_color = 'gray')

我找到了解决办法: 我通过对值进行排序然后转换数据帧值和因子来创建一个因子列表。那时我创建了一个 CategoricalColorMapper 而不是线性的,现在绘图是正确的: