2017-07-18 5 views
1

Ich habe einen Datenrahmen alsWie kann ich einem Bokeh-Balkendiagramm ein Label hinzufügen?

df = pd.DataFrame(data = {'Country':'Spain','Japan','Brazil'],'Number':[10,20,30]}) 

I ein Balkendiagramm mit Etikett plotten wollte (der Wert von ‚Nummer‘ ist) an der Oberseite für jeden Balken und annotiert verlaufen entsprechend.

from bokeh.charts import Bar, output_file,output_notebook, show 
    from bokeh.models import Label 
    p = Bar(df,'Country', values='Number',title="Analysis", color = "navy") 
    label = Label(x='Country', y='Number', text='Number', level='glyph',x_offset=5, y_offset=-5) 
    p.add_annotation(label)  
    output_notebook() 
    show(p) 

Aber ich habe einen Fehler als ValueError: expected a value of type Real, got COuntry of type str.

Wie löse ich dieses Problem?

Antwort

0

Label erzeugt ein einzelnes Etikett an Position x und y. In diesem Beispiel versuchen Sie, mehrere Labels mit den Daten aus Ihrem Datenrahmen als Koordinaten hinzuzufügen. Aus diesem Grund erhalten Sie die Fehlermeldung x und y müssen echte Koordinatenwerte sein, die den x_range und y_range der Figur entsprechen. Sie sollten in die Verwendung von LabelSet (link) schauen, die ein Bokeh ColumnDataSource als ein Argument nehmen und mehrere Etiketten bauen kann.

Unforutnately, Sie verwenden auch einen Bokeh Balkendiagramm, das ein hohes Maß-Diagramm ist, das eine kategorische y_range schafft. Bokeh kann jetzt keine kategorischen y_ranges mit Labels versehen. Sie können dieses Problem umgehen, indem Sie unter Verwendung von Platzhalter-x-Werten ein niedrigeres vbar Diagramm erstellen und es dann so formatieren, dass es dem Aussehen Ihres ursprünglichen Diagramms entspricht. Hier ist es in Aktion.

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

# arbitrary placeholders which depends on the length and number of labels 
x = [1,2,3] 
# This is offset is based on the length of the string and the placeholder size 
offset = -0.05 
x_label = [x + offset for x in x] 

df = pd.DataFrame(data={'Country': ['Spain', 'Japan', 'Brazil'], 
         'Number': [10, 20, 30], 
         'x': x, 
         'y_label': [-1.25, -1.25, -1.25], 
         'x_label': x_label}) 

source = ColumnDataSource(df) 

p = figure(title="Analysis", x_axis_label='Country', y_axis_label='Number') 
p.vbar(x='x', width=0.5, top='Number', color="navy", source=source) 
p.xaxis.ticker = FixedTicker(ticks=x) # Create custom ticks for each country 
p.xaxis.major_label_text_font_size = '0pt' # turn off x-axis tick labels 
p.xaxis.minor_tick_line_color = None # turn off x-axis minor ticks 
label = LabelSet(x='x_label', y='y_label', text='Number', 
       level='glyph', source=source) 
p.add_layout(label) 
show(p) 
Verwandte Themen