2016-04-18 3 views
1

Ich habe folgende Handlung:Wie können Bokeh-Legenden mit Streudiagrammen unter Verwendung eines Datenrahmens angezeigt werden?

import pandas as pd 
from bokeh.plotting import ColumnDataSource, figure, output_file, show 
from bokeh.models import HoverTool 

output_file("scatter.html") 
df = pd.read_csv('/Users/jz/07_isolate_selection.csv') 
hash = {} 

c = ('aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 
    'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 
    'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 
    'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 
    'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 
    'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 
    'firebrick', 'floralwhite', 'forestgreen', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 
    'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 
    'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 
    'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 
    'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 
    'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 
    'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 
    'moccasin', 'navajowhite', 'navy', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 
    'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 
    'purple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 
    'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 
    'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen'); 


#loop through and assign colors: 
counter = 0 
for a in df.material.unique(): 
    hash[a] = c[counter] 
    counter += 1 

# generate colors: 

colors = [hash[code] for code in df.material] 
df['color'] = colors 


source = ColumnDataSource(df) 
TOOLS="pan,wheel_zoom,box_zoom,reset,hover" 
p = figure(title="Hoverful Scatter", tools=TOOLS) 
p.circle('peak.count', 'purity.score', radius=.66, source=source, 
      fill_color=colors, fill_alpha=0.6, line_color=None) 

hover = p.select(dict(type=HoverTool))[0] 
hover.tooltips = [ 
    ("material", "@material") 
] 

show(p) 

Wie kann ich eine Legende angezeigt werden, die in df.material Spalte definiert den Gruppen entspricht? Die Farbcodierung funktioniert unten, wo ich die Kreise nach dem df.material gruppiere, aber ich möchte auch eine Legende anzeigen, so dass Sie wissen, dass "aliceblue" mit "FOO" und "olive" mit "BAR" als entspricht Beispiel.

Danke!

+0

[Möglicherweise verwandte] (https://stackoverflow.com/questions/43983039/color-points-in hilft -Scatter-Plot-von-Bokeh). Das sind eine Menge einzigartiger Farben, aber Sie können in den [CategoricalColorMapper] (https://bokeh.pydata.org/en/latest/docs/reference/models/mappers.html#bokeh.models.mappers.CategoricalColorMapper) schauen. – Hendy

+0

und mein Favorit ist Darksalmon! –

Antwort

0

Ich hatte ein ähnliches Problem mit meinem Liniendiagramm und meine Lösung bestand darin, p.line() in eine for-Schleife einzufügen. Überprüfen Sie dieses einfache Beispiel here.

Überprüfen Sie auch my notebook mit einem komplexeren Beispiel, wo ich ein Multi-Liniendiagramm mit dieser Methode machen.

Viel Glück!

0

Auf Bokeh 0.12.3

Sie könnten versuchen, eine Spalte 'Farben' für Datenrahmen machen df ein Wörterbuch verwenden, können sagen:

colors = {'typeA':'red', 'typeB':'blue', 'typeC':'black'} 

wo die colors.keys() sind aus die Werte auf Ihrem df des typeColumn

Sie nun die Farbspalte zu df hinzufügen:

df['colorColumn'] = [colors[key] for key in df.typeColumn.values] 

so brauchen Sie nur die Spalten von der Quelle zugreifen, die Sie gerade

p.circle('x', 'y', size=8, fill_color='colorColumn', legend='typeColumn', source=source) 

Hoffnung definiert, die

Verwandte Themen