Puntos de color en el diagtwig de dispersión de Bokeh

Tengo los siguientes pandas.DataFrame simple:

 df = pd.DataFrame( { "journey": ['ch1', 'ch2', 'ch2', 'ch1'], "cat": ['a', 'b', 'a', 'c'], "kpi1": [1,2,3,4], "kpi2": [4,3,2,1] } ) 

Que trazo de la siguiente manera:

 import bokeh.plotting as bpl import bokeh.models as bmo bpl.output_notebook() source = bpl.ColumnDataSource.from_df(df) hover = bmo.HoverTool( tooltips=[ ("index", "@index"), ('journey', '@journey'), ("Cat", '@cat') ] ) p = bpl.figure(tools=[hover]) p.scatter( 'kpi1', 'kpi2', source=source) bpl.show(p) # open a browser 

Estoy fallando en el código de color de los puntos de acuerdo con el cat . En última instancia, quiero tener el primer y tercer punto en el mismo color, y el segundo y cuarto en dos colores más diferentes.

¿Cómo puedo lograr esto usando Bokeh?

Aquí hay una forma que evita el mapeo manual hasta cierto punto. Recientemente me topé con bokeh.palettes en este problema de github , así como CategoricalColorMapper en este problema . Este enfoque los combina. Vea la lista completa de paletas disponibles aquí y los detalles de CategoricalColorMapper aquí .

Tuve problemas para que esto funcionara directamente en un pd.DataFrame , y también encontré que no funcionó usando tu llamada from_df() . Los documentos muestran DataFrame pasa un DataFrame directamente, y eso me funcionó.

 import pandas as pd import bokeh.plotting as bpl import bokeh.models as bmo from bokeh.palettes import d3 bpl.output_notebook() df = pd.DataFrame( { "journey": ['ch1', 'ch2', 'ch2', 'ch1'], "cat": ['a', 'b', 'a', 'c'], "kpi1": [1,2,3,4], "kpi2": [4,3,2,1] } ) source = bpl.ColumnDataSource(df) # use whatever palette you want... palette = d3['Category10'][len(df['cat'].unique())] color_map = bmo.CategoricalColorMapper(factors=df['cat'].unique(), palette=palette) # create figure and plot p = bpl.figure() p.scatter(x='kpi1', y='kpi2', color={'field': 'cat', 'transform': color_map}, legend='cat', source=source) bpl.show(p) 

Para completar, aquí está el código adaptado que usa una tabla de bajo nivel :

 import pandas as pd import bokeh.plotting as bpl import bokeh.models as bmo bpl.output_notebook() df = pd.DataFrame( { "journey": ['ch1', 'ch2', 'ch2', 'ch1'], "cat": ['a', 'b', 'a', 'c'], "kpi1": [1,2,3,4], "kpi2": [4,3,2,1], "color": ['blue', 'red', 'blue', 'green'] } ) df source = bpl.ColumnDataSource.from_df(df) hover = bmo.HoverTool( tooltips=[ ('journey', '@journey'), ("Cat", '@cat') ] ) p = bpl.figure(tools=[hover]) p.scatter( 'kpi1', 'kpi2', source=source, color='color') bpl.show(p) 

Tenga en cuenta que los colores están “codificados” en los datos.

Aquí está la alternativa usando un gráfico de alto nivel :

 import pandas as pd import bokeh.plotting as bpl import bokeh.charts as bch bpl.output_notebook() df = pd.DataFrame( { "journey": ['ch1', 'ch2', 'ch2', 'ch1'], "cat": ['a', 'b', 'a', 'c'], "kpi1": [1,2,3,4], "kpi2": [4,3,2,1] } ) tooltips=[ ('journey', '@journey'), ("Cat", '@cat') ] scatter = bch.Scatter(df, x='kpi1', y='kpi2', color='cat', legend="top_right", tooltips=tooltips ) bch.show(scatter) 

Podrías usar el nivel superior de Scatter como aquí.

o proporcione una columna de color a ColumnDataSource y ColumnDataSource referencia a ella en su p.scatter(..., color='color_column_label')