2017-07-18 147 views
1

我有一個數據幀作爲如何將標籤添加到散景條形圖?

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

我想繪製帶標籤的條形圖(即「編號」的值)註釋在頂部爲每個條,並相應地進行。

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) 

但是我得到了一個錯誤,如ValueError: expected a value of type Real, got COuntry of type str

我該如何解決這個問題?

回答

0

Label在位置xy處產生單個標籤。在你的例子中,你試圖使用DataFrame中的數據作爲座標來添加多個標籤。這就是爲什麼你要讓你的錯誤信息xy需要是映射到圖形的x_range和y_range的實座標值。你應該考慮使用LabelSetlink),它可以將散景ColumnDataSource作爲參數並構建多個標籤。

毫無疑問,您還在使用一個散焦條形圖,它是一個創建分類y_range的高級圖表。目前,Bokeh不能將標籤放在分類y_ranges上。您可以通過使用佔位符x值創建較低級別的vbar圖表,然後對其進行樣式設置,使其與原始圖表具有相同的外觀,從而繞過此問題。它在行動中。

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)