我正在尝试创建一个相当复杂的散景圆图,其中包含几个复杂的交互(轴变化和年滑块和其他)。我似乎主要使它工作,并且没有使用ColumnDataSource(因为我借用的模板没有使用它)。现在我需要创建一个自定义图例(或HoverTool(??))。
我设法创建了一个自定义图例,但我不知道如何传递它被分配到图例中的matplotlib颜色。所以目前,它只是一个显示所有图例项目但没有颜色标识符的图例。如何将正确的颜色传递到图例?
以下是我的代码的相关部分:
数据帧:
FULLNAME | ES | TX | YEAR
Jim 3 12 2008
...
Tim 33 8 2009
import matplotlib
import random
from datetime import date
user_list= list(set((df["FULLNAME"])))
colordict=dict(matplotlib.colors.cnames.items())
colordict=list(colordict.values())
random_colors=random.sample(colordict,len(user_list))
def yr_slider():
current=slider.value
ys=df[y.value][df["YEAR"]==current].values
p = figure(plot_width=930, plot_height=325, background_fill_color='snow', x_range=(2016,2019))
p.circle(x=df["YEAR"][df["YEAR"]==current], y=ys, size= 20,
color=random_colors)
legend=Legend(items=[("Jim",random_colors[1]),
("Tim",[])
]) ###THIS AINT WORKIN RIGHT###
p.add_layout(legend,'right')
print(ys)
return p
def update(attr, old, new):
layout2.children[1]=yr_slider()
slider=Slider(start=2017, end=date.today().year, step=1, value=date.today().year, title="Year")
slider.on_change('value', update)
y=Select(title='X-Axis', value='ES',options=['TX','ES'])
y.on_change('value',update)
ctrls=widgetbox([y,slider], width=200)
layout2=row(ctrls,yr_slider())
curdoc().add_root(layout2)
谢谢!
答案 0 :(得分:1)
图例项目将标签与渲染器列表相关联,而不是与颜色相关联。
legend = Legend(items=[(label,list_of_GlyphRenderers)])
如果列表中有多个Glyphrenderers,如果它们属于同一类型,则只显示第一个的颜色。
如果第一个使用多种颜色,则只显示第一种颜色。
如果Glyphrenderers有不同的类型(例如圆和线),那么它们将组合在图例的小图标中。
您可以将多个渲染器附加到同一个图例项目,这对于此非常有用,并且在启用交互式图例时可以同时控制多个渲染器的可见性。
这里只有一个渲染器circle()
,但颜色不同,因此只使用第一种颜色。我不知道如何直接自定义图例图标。
您可以为每个点单独调用Circle
from bokeh.io import show
from bokeh.models import Legend
from bokeh.plotting import figure
names = ["Jim","Bob","Assia"]
colors = ["red","blue","green"]
fig = figure()
items = []
for i in range(3):
items += [(names[i],[fig.circle(i,i,color=colors[i],size=20)])]
fig.add_layout(Legend(items=items),'right')
show(fig)
但如果你有很多分数,那么使用Hovertool可能会更好。