#bokeh #legend-properties
Вопрос:
У меня проблема с цветом точек легенды. Все они красные, в то время как он должен переключиться с красного на зеленый в 7.
Код, который создает последнее изображение, является:
from bokeh.models import ColumnDataSource, Label, LabelSet, Range1d, Legend
from bokeh.plotting import figure, output_file, show
from bokeh.models import HoverTool
df = pd.DataFrame({'pc1': range(11),
'pc2': range(10,-1,-1),
'Muestra': ['A']*6 ['B']*5,
'color':['#cf0c0c']*6 ['#0dab51']*5},
index=range(1,12))
ID = ['{} {}'.format(i 1,j) for i,j in enumerate(df.Muestra)]
source = ColumnDataSource(data=dict(pc1=df.pc1,
pc2=df.pc2,
color=df.color,
ID=ID,
names=df.index))
p = figure(title='Principal Component Analysis')
p.scatter(x='pc1', y='pc2', size=15, fill_color='color', fill_alpha=0.6, line_color=None, source=source)
labels = LabelSet(x='pc1', y='pc2', text='names',
x_offset=5, y_offset=5, source=source, render_mode='canvas')
legend=Legend(items=[(ID[i-1],[p.renderers[0]]) for i in df.index])
p.add_layout(legend,'right')
p.add_layout(labels)
show(p)
Я думаю, что это должно быть свойство рендеринга, но я не уверен.
Ответ №1:
Вместо того, чтобы создавать легенду вручную, вы также можете указать «ИДЕНТИФИКАТОР», который будет использоваться для legend_field
визуализации рассеяния. Это автоматически создаст для вас легенду, в которой каждая запись будет соответствовать каждому уникальному значению в столбце «Идентификатор».:
import pandas as pd
from bokeh.models import ColumnDataSource, Label, LabelSet, Range1d, Legend
from bokeh.plotting import figure, output_file, show
from bokeh.models import HoverTool
df = pd.DataFrame(
{
"pc1": range(11),
"pc2": range(10, -1, -1),
"Muestra": ["A"] * 6 ["B"] * 5,
"color": ["#cf0c0c"] * 6 ["#0dab51"] * 5,
},
index=range(1, 12),
)
ID = ["{} {}".format(i 1, j) for i, j in enumerate(df.Muestra)]
source = ColumnDataSource(
data=dict(pc1=df.pc1, pc2=df.pc2, color=df.color, ID=ID, names=df.index)
)
p = figure(title="Principal Component Analysis")
p.scatter(
x="pc1",
y="pc2",
size=15,
fill_color="color",
fill_alpha=0.6,
line_color=None,
source=source,
legend_field="ID" # New kwarg added here
)
labels = LabelSet(
x="pc1",
y="pc2",
text="names",
x_offset=5,
y_offset=5,
source=source,
render_mode="canvas",
)
# Removed these 2 lines
# legend=Legend(items=[(ID[i-1],[p.renderers[0]]) for i in df.index])
# p.add_layout(legend,'right')
p.add_layout(labels)
show(p)
Ответ №2:
Вам нужно задать явный индекс для элементов легенды, чтобы указать им, для какой строки вы хотите, чтобы они рисовались. В противном случае по умолчанию элемент легенды просто рисуется на основе данных в первой строке источника данных средства визуализации.
LegendItem(label="some text", renderers=[r], index=i),