我的数据框为
df = pd.DataFrame(data = {'Country':'Spain','Japan','Brazil'],'Number':[10,20,30]})
我想绘制一个带有标签的条形图(其值为'Number'),在每个条形图的顶部注释并相应地进行。
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 :(得分:1)
Label
在位置x
和y
处生成一个标签。在您的示例中,您尝试使用DataFrame中的数据作为坐标添加多个标签。这就是为什么您收到错误消息的原因x
和y
需要是映射到数字x_range和y_range的实际坐标值。您应该考虑使用LabelSet
(link),它可以将Bokeh 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)