散景 - 根据圆圈大小在p.circle()上创建一个图例

时间:2018-03-08 15:42:15

标签: python legend heatmap bokeh

我根据以下数据框制作了热图:

   Species categories value1 value2
0      sp1       cat1  218.0    2.0
1      sp1       cat2  521.0    2.0
2      sp1       cat3  533.0    2.0
3      sp1       cat4  793.0    3.0
4      sp2       cat1  225.0    2.0
5      sp2       cat2  521.0    2.0
6      sp2       cat3  540.0    2.0
7      sp2       cat4  800.0    3.0
8      sp3       cat1  217.0    1.0
9      sp3       cat2  477.0    1.0
10     sp3       cat3  512.0    3.0
11     sp3       cat4  725.0    3.0

categories是x轴列Species是y轴。热图元素是圆形,颜色范围基于value1的值,圆形大小基于value2

我的观点是关于传说;由于散景教程,我设法为color_bar绘制value1比例,但我无法找到如何为value2制作图例...

我的代码看起来像这样:

# stuff
colors = ["#75968f", "#a5bab7", "#c9d9d3", "#e2e2e2", "#dfccce", "#ddb7b1", "#cc7878", "#933b41", "#550b1d"]
mapper = LinearColorMapper(palette=colors, low=df.value1.min(), high=df.value1.max()) 

xrange = list(df.columns)
yrange = list(df.index)    

# figure    
p = figure(title='title',
       x_range=xrange, y_range=yrange,
       x_axis_location="above", plot_width=400, plot_height=200,
       toolbar_location=None, tools=""
       )

# draw the circles
p.circle(x="categories", y="Species", size="value2",
    source=df,
    fill_color={'field': "value1", 'transform': mapper},
    line_color=None)

# Legend for circles colors
color_bar = ColorBar(color_mapper=mapper, major_label_text_font_size="10pt",
                             ticker=BasicTicker(desired_num_ticks=len(colors)),
                             formatter=PrintfTickFormatter(format="%.3f"),
                             label_standoff=15, border_line_color=None, location=(0, 0))
p.add_layout(color_bar, 'right')

# missing : legend for circles size !

有没有办法做那种传奇?

1 个答案:

答案 0 :(得分:0)

从Bokeh 0.12.14开始,这仍然是open issue,并且没有一个很好的内置方法来做到这一点。我已经将这个问题重新分类为一个短期里程碑,尽管总是使用OSS,唯一保证帮助任务和功能更快发生的事情是让更多的贡献者投入。

您可以创建自定义扩展程序来绘制专门的图例:

https://bokeh.pydata.org/en/latest/docs/user_guide/extensions.html

这需要更多的迭代和来回讨论,而不是适合SO答案,但请随时来project mailing list