散景颜色条,为每种颜色分配一个刻度
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 而不是线性的,现在绘图是正确的:
我正在尝试绘制包含一些计数的矩阵的热图(在我的代码中称为 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 而不是线性的,现在绘图是正确的: