如何解决在Bokeh中使标记fill_alpha值依赖
在Bokeh中,是否可以使标记的alpha值随指定字段中的值而变化?
例如,按字段更改颜色和标记:
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.transform import factor_cmap,factor_mark
df = some dataframe
palette = ['#440154','#404387','#29788E','#22A784','#79D151','#FDE724']
bok_sym = ['circle','asterisk','square_x','circle_x','diamond','hex']
cat_lst = list(df['cat_field'].unique())
df_cds = ColumnDataSource(data=df)
fig = figure(some kwargs)
fig.scatter(x='x',y='y',source = df_cds,marker = factor_mark('cat_field',bok_sym,cat_lst)
fill_color = factor_cmap('cat_field',palette,cat_lst),)
show(fig)
对于alpha来说似乎没有类似的显式函数,但是bokeh.transform确实提供了通用转换
https://docs.bokeh.org/en/latest/docs/reference/transform.html
我尝试添加以下内容:
from bokeh.transform import transform
alph_lst = [0.2,0.9,0.9]
fig.scatter(x='x',cat_lst)
fill_color = factor_cmap('cat_field',fill_alpha = transform('cat_field',dict(zip(cat_lst,alph_lst))),)
但没有成功。
欢呼
编辑:
我会注意到我已经(未成功)尝试将透明度作为十六进制代码的一部分传递:
调色板= ['#44015433','#404387E6','#29788EE6','#22A784E6','#79D151E6','#FDE724E6']
解决方法
正如您在问题中所述,您绝对可以使用自定义Transform实现此目的。他们有点笨拙(我认为),但是希望这段代码可以清除它。
基本上,您需要3个步骤来创建自定义javascript函数并将其应用于bokeh中的字段名称:
- 编写实现所需转换的javascript代码。在我们的例子中,我们只是将分类值映射到字典中的alpha级别。
- 将此JavaScript代码段放入
CustomJSTransform
对象中,并将其必要的参数作为字典提供。在这种情况下,我在python中构建了factor -> alpha
映射,并将其传递到javascript中。我们使用vfunc
参数是因为我们想将此转换应用于数据中类别的每个实例。 - 在调用绘图功能
p.scatter
时,请使用transform
函数将您指定的列名称与自定义转换相关联。在这种情况下,alpha = transform("cat_field",categorical_alpha_transformer)
import pandas as pd
import numpy as np
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.transform import factor_cmap,factor_mark,transform
from bokeh.models.transforms import CustomJSTransform
from bokeh.io import output_notebook,show
output_notebook()
v_func = """
var new_xs = new Array(xs.length)
for(var i = 0; i < xs.length; i++) {
new_xs[i] = alpha_map[xs[i]]
}
return new_xs
"""
df = pd.DataFrame({
"cat_field": list("abcdef"),"x": list(range(6)),"y": list(range(6)),})
palette = ['#440154','#404387','#29788E','#22A784','#79D151','#FDE724']
bok_sym = ['circle','asterisk','square_x','circle_x','diamond','hex']
alphas = [.1,.25,.4,.55,.7,.85,1]
cat_lst = list(df['cat_field'].unique())
alpha_map = dict(zip(cat_lst,alphas)) # {"a": .1,"b": .25,... "f": 1}
categorical_alpha_transformer = CustomJSTransform(args={"alpha_map": alpha_map},v_func=v_func)
df_cds = ColumnDataSource(data=df)
fig = figure(width=250,height=250)
fig.scatter(
x='x',y='y',source = df_cds,marker = factor_mark('cat_field',bok_sym,cat_lst),fill_color = factor_cmap('cat_field',palette,size=20,alpha = transform("cat_field",categorical_alpha_transformer)
)
show(fig)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。