Свойства цвета легенды Боке

#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),