Python 显示散射半径的博克第二个图例
我有一个使用极坐标投影的博克散点图(Python 显示散射半径的博克第二个图例,python,bokeh,Python,Bokeh,我有一个使用极坐标投影的博克散点图(Bokeh==1.0.4)。点的半径对应于ColumnDataSource中的RadiusSize,颜色对应于DepthClass 我创建了第二个“虚拟”散点图,以获得对应于填充颜色(深度>图例)的图例。我想要第二个与半径相对应的图例。radiusize数据是介于1到5之间的整数。我正在寻找第二个传说非常类似(见公认的答案) 以下是我的相关绘图代码: def make_scatter(event_data): ''' Create a polar sc
Bokeh==1.0.4
)。点的半径对应于ColumnDataSource中的RadiusSize
,颜色对应于DepthClass
我创建了第二个“虚拟”散点图,以获得对应于填充颜色
(深度>图例
)的图例。我想要第二个与半径相对应的图例。radiusize
数据是介于1到5之间的整数。我正在寻找第二个传说非常类似(见公认的答案)
以下是我的相关绘图代码:
def make_scatter(event_data):
'''
Create a polar scatter figure
Parameters
----------
event_data: Pandas dataframe
Returns
-------
p: Bokeh Figure object
'''
cds = create_cds(event_data)
p = figure(
title="",
name="scatter_fig",
width=600, height=600,
tools='',
)
# Project data into polar coordinates
# customjs from bryevdv (https://github.com/bokeh/bokeh/issues/657)
polarx = CustomJSTransform(args=dict(source=cds), v_func='''
const new_xs = new Array(source.data.elev_project_vectors.length)
for(var i = 0; i < new_xs.length; i++) {
new_xs[i] = source.data.elev_project_vectors[i] * Math.sin(source.data.elev_angles[i] )
}
return new_xs
''')
polary = CustomJSTransform(args=dict(source=cds), v_func='''
const new_ys = new Array(source.data.elev_project_vectors.length)
for(var i = 0; i < new_ys.length; i++) {
new_ys[i] = source.data.elev_project_vectors[i] * Math.cos(source.data.elev_angles[i] )
}
return new_ys
''')
event_scatter = p.scatter(
x=transform('elev_project_vectors', polarx),
y=transform('elev_project_vectors', polary),
radius='RadiusSize',
fill_color='DepthClass', fill_alpha=1.0,
name='event_scatter',
source=cds)
# This is a dummy glyph just to have consistent colors for a custom legend
event_scatter_dummy = p.scatter(
x=[1,2,3],
y=[1,2,3],
radius=0,
fill_color=['green','yellow','red'], fill_alpha=1.0,
name='event_scatter_dummy',
)
depth_legend = Legend(items=[
LegendItem(label='crown < 12"', renderers=[event_scatter_dummy], index=0),
LegendItem(label='crown 12-44"', renderers=[event_scatter_dummy], index=1),
LegendItem(label='crown > 44"', renderers=[event_scatter_dummy], index=2),
])
p.add_layout(depth_legend)
return p
def生成散点(事件数据):
'''
创建极坐标散点图
参数
----------
事件_数据:熊猫数据帧
退换商品
-------
p:Bokeh图形对象
'''
CD=创建CD(事件数据)
p=数字(
title=“”,
name=“散布图”,
宽度=600,高度=600,
工具=“”,
)
#将数据投影到极坐标中
#来自bryevdv的customjs(https://github.com/bokeh/bokeh/issues/657)
polarx=CustomJSTransform(args=dict(source=cds),v_func=''
const new_xs=新数组(source.data.elev_project_vectors.length)
对于(变量i=0;i44',渲染器=[event\u District\u dummy],索引=2),
])
p、 添加\u布局(深度\u图例)
返回p
下面是当前Bokeh图形的屏幕截图,其中有一个对应于填充颜色的图例
:
理想情况下,第二个图例将有标签(R1、R2、R3、R4、R5)以及相应范围内不断增加的半径圆。如何获得第二个图例?我能够通过创建一个虚拟不可见圆,然后创建并叠加五个单独的呈现虚拟圆的
图例
实例来解决这一问题。每个图例都需要使用位置
和label_standoff
以正确对齐。然后,我循环遍历圆形图示符并调整其大小,使其与打印数据的半径相对应
这不是一个理想的解决方案,因为图例与实际数据无关,但它可以直观地完成任务
以下是博克代码:
event_radius_dummy_1 = p.circle(
1,1,
radius=0,
fill_alpha=0.0, line_color='black',
name='event_radius_dummy_1'
)
event_legend1 = Legend(items=[
LegendItem(label='R1', renderers=[event_radius_dummy_1])],
location=(20,554), label_standoff=10, label_height=3)
event_legend2 = Legend(items=[
LegendItem(label='R2', renderers=[event_radius_dummy_1])],
location=(14,532), label_standoff=5)
event_legend3 = Legend(items=[
LegendItem(label='R3', renderers=[event_radius_dummy_1])],
location=(8,507), label_standoff=0)
event_legend4 = Legend(items=[
LegendItem(label='R4', renderers=[event_radius_dummy_1])],
location=(2,479), label_standoff=-5)
event_legend5 = Legend(items=[
LegendItem(label='R5', renderers=[event_radius_dummy_1])],
location=(-4,447), label_standoff=-10)
event_legend_list = [event_legend1,event_legend2,event_legend3,event_legend4,event_legend5]
for legend in event_legend_list:
p.add_layout(legend)
size_list = [15,26,37,48,59]
index_list = [1,2,3,4,5]
for index, size in zip(index_list, size_list):
p.legend[index].glyph_height = size
p.legend[index].glyph_width = size
p.legend[index].padding = 0
p.legend[index].margin = 0
p.legend[index].border_line_alpha = 0
p.legend[index].background_fill_alpha = 0
结果数字: