Боке: Как показать цвет и тип маркера в легенде - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу нарисовать легенду, которая отображает цвет линии и тип маркера при использовании пакета boekh в блокноте jupyter.

У меня много линий на одном графике.Чтобы различать их, я изо всех сил старался различать их, равномерно распределяя их цвет в цветовом пространстве.Однако, когда количество линий достигает, например, 9, цвет некоторых линий довольно похож.Итак, я хочу добавить разные типы маркеров поверх разных цветов, чтобы, когда две линии были похожи по цвету, они имели разные типы маркеров.Это было прямо с matplotlib, но не прямо с боке.Ниже приведен код, который у меня есть, который может отображать легенду только цветом.

import pandas as pd
import numpy as np
import math
import matplotlib.pyplot as plt
%matplotlib inline
from bokeh.plotting import figure, show, ColumnDataSource, save,     output_notebook, output_file, reset_output
from bokeh.io import export_svgs,export_png
from bokeh.models import HoverTool, Legend
from bokeh.layouts import gridplot
import colorsys # needed for generating N equally extinguishable colors
from operator import add # needed for add lists

d = {'Sex': ['male', 'male','male','male', 'male','male','female','female','female','female','female','female'], 'age': [20, 20,20, 25,25,25,20, 20,20,25,25,25], 'working_hours': [20,30,40,20,30,40,20,30,40,20,30,40],'income': [1000, 2000,3000,1500, 2500,3500,1100, 2100,3100,1300, 2300,3300] }
values = pd.DataFrame(data=d)

x_var = 'working_hours'
x_var_dimension = 'H'
y_var = 'income'
y_var_dimension = 'Dollars'
hover = HoverTool(tooltips=[("data (x,y)", "(@x, @y)")])
TOOLS=[hover]
p= figure(width=1200, height=600,tools=TOOLS, x_axis_type='linear', x_axis_label='%s [%s]'%(x_var, x_var_dimension),y_axis_label='%s [%s]'%(y_var, y_var_dimension))
nr_expressions_row_col=9
figs_array_row_col = []
figs_row_row_col=[]
legend_its_row_col = []
legend_its_row_col_renderer = []
loop_count = 0;
for key, group in values.groupby(['Sex']):
    for key_sub1, group_sub1 in group.groupby(['age']):
        loop_count+=1
        #print type(key)
        #print group_sub1
        #print count
        #hover = HoverTool(tooltips=[("data (x,y)", "($x, $y)")])
        x_data = group_sub1[x_var].values;
        y_data =  group_sub1[y_var].values
        (color_r,color_g,color_b) = colorsys.hsv_to_rgb(loop_count*1.0/nr_expressions_row_col, 1, 1)
        plot_row_col_line = p.line(x_data, y_data,line_color=(int(255*color_r),int(255*color_g),int(255*color_b)))
        legend_its_row_col.append(("%s %s"%(key,key_sub1), [plot_row_col_line]))


legend_row_col = Legend(items = legend_its_row_col, location=(0,0))
legend_row_col.click_policy = 'hide'
legend_row_col.background_fill_alpha = 0
p.add_layout(legend_row_col, 'left')

figs_row_row_col.append(p)
figs_array_row_col.append(figs_row_row_col)

grid_row_col = gridplot(figs_array_row_col)
reset_output()
output_notebook()
show(grid_row_col)

Что я могу получить с помощью своего кода: actual results Что я хочу: expected results

1 Ответ

0 голосов
/ 15 февраля 2019

Это должно дать желаемый результат, я добавил циклический список со всеми маркерами, которые можно использовать с p.scatter, и он принимает другой маркер на каждой итерации.После этого я добавляю его с глифом строки в словарь легенды.

#!/usr/bin/python3
import pandas as pd
import numpy as np
import math
from bokeh.plotting import figure, show, ColumnDataSource, save, output_file, reset_output
from bokeh.models import HoverTool, Legend
from bokeh.layouts import gridplot
import colorsys # needed for generating N equally extinguishable colors
from itertools import cycle

d = {'Sex': ['male', 'male','male','male', 'male','male','female','female','female','female','female','female'], 'age': [20, 20,20, 25,25,25,20, 20,20,25,25,25], 'working_hours': [20,30,40,20,30,40,20,30,40,20,30,40],'income': [1000, 2000,3000,1500, 2500,3500,1100, 2100,3100,1300, 2300,3300] }
values = pd.DataFrame(data=d)

x_var = 'working_hours'
x_var_dimension = 'H'
y_var = 'income'
y_var_dimension = 'Dollars'
hover = HoverTool(tooltips=[("data (x,y)", "(@x, @y)")])
TOOLS=[hover]
p= figure(width=1200, height=600,tools=TOOLS, x_axis_type='linear', x_axis_label='%s [%s]'%(x_var, x_var_dimension),y_axis_label='%s [%s]'%(y_var, y_var_dimension))
nr_expressions_row_col=9
figs_array_row_col = []
figs_row_row_col=[]
legend_its_row_col = []
legend_its_row_col_renderer = []
loop_count = 0;
markers = ['circle', 'square', 'triangle', 'asterisk', 'circle_x', 'square_x', 'inverted_triangle', 'x', 'circle_cross', 'square_cross', 'diamond', 'cross']
pool = cycle(markers)
for key, group in values.groupby(['Sex']):
    for key_sub1, group_sub1 in group.groupby(['age']):
        loop_count+=1
        x_data = group_sub1[x_var].values;
        y_data =  group_sub1[y_var].values
        (color_r,color_g,color_b) = colorsys.hsv_to_rgb(loop_count*1.0/nr_expressions_row_col, 1, 1)
        plot_row_col_line = p.line(x_data, y_data,line_color=(int(255*color_r),int(255*color_g),int(255*color_b)))
        plot_row_col_glyph = p.scatter(x_data, y_data, color=(int(255*color_r),int(255*color_g),int(255*color_b)), size=10, marker=next(pool))
        legend_its_row_col.append(("%s %s"%(key,key_sub1), [plot_row_col_line, plot_row_col_glyph]))


legend_row_col = Legend(items = legend_its_row_col, location=(0,0))
legend_row_col.click_policy = 'hide'
legend_row_col.background_fill_alpha = 0
p.add_layout(legend_row_col, 'left')

figs_row_row_col.append(p)
figs_array_row_col.append(figs_row_row_col)

grid_row_col = gridplot(figs_array_row_col)
reset_output()
show(grid_row_col)

enter image description here

...