Python Боке - интерактивная легенда, скрывающая глифы - не работает - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь реализовать интерактивную легенду Bokeh, чтобы фильтровать данные, построенные на основе выбора пользователя. Мне нужна помощь, чтобы выяснить, что не так с моим кодом; Я получил несколько глифов для каждого использования, разного цвета (см. Изображения ниже).

#Import libraries
from bokeh.io import output_notebook, show
from bokeh.models.sources import ColumnDataSource
from bokeh.plotting import figure
from bokeh.palettes import Category20_20
import pandas as pd

output_notebook()
#Create the dataframe
df = pd.DataFrame({'Index': ['9', '10', '11', '12', '13'],
        'Size': ['25', '15', '28', '43', '18'], 
        'X': ['751', '673', '542', '362', '224'],
        'Y': ['758', '616', '287', '303', '297'],
        'User': ['u1', 'u1', 'u2', 'u2', 'u2'],
        'Location': ['A', 'B', 'C', 'C', 'D'], 
        })

# Create plot

p = figure(plot_width=450, plot_height=450)
p.title.text = 'Title....'

users=list(set(df['User']))
size=df['Size']
for data, name, color in zip(df, users, Category20_20):
    p.circle(x=df['X'], y=df['Y'], size=size, color=color, alpha=0.8, legend=name)

p.legend.location = "top_left"
p.legend.click_policy="hide"

show(p)

enter image description here enter image description here

1 Ответ

1 голос
/ 26 мая 2020

В этом l oop

for data, name, color in zip(df, users, Category20_20):
    p.circle(x=df['X'], y=df['Y'], size=size, color=color, alpha=0.8, legend=name)

вы:

  • Итерации по именам столбцов фрейма данных (потому что Pandas очень сбивает с толку в этом отношении ), поэтому ваше количество очков будет ограничено (потому что zip останавливается на самом коротком сборе)
  • Не используется data
  • Передача полных данных в p.circle, что означает, что у вас есть два набора кругов с полностью идентичными координатами и размерами
  • Использование ключевого слова legend, которое устарело

Вместо этого попробуйте следующее:

users=list(set(df['User']))
for name, color in zip(users, Category20_20):
    user_df = df[df['User'] == name]
    p.circle(x=user_df['X'], y=user_df['Y'], size=user_df['Size'],
             color=color, alpha=0.8, legend_label=name)
...