如何使用CSV文件为Bokeh的vbar垂直柱状图提供数据?
解决Bokeh结合CSV数据绘制Gridplot的问题
你的CSV数据仅包含一行记录,直接用原始格式绘图会因数据结构不匹配出现异常。需要先将宽格式数据转换为长格式,再基于处理后的数据创建子图并组合成Gridplot。
完整实现代码
import pandas as pd from bokeh.plotting import figure, output_file, show from bokeh.models import ColumnDataSource, HoverTool from bokeh.layouts import gridplot from bokeh.palettes import Spectral4 # 读取CSV数据 df = pd.read_csv('./lecturespace/2013data.csv', names=['Birth', 'Death', 'Young', 'Old']) # 重塑数据:宽格式转长格式,适配Bokeh绘图需求 melted_df = df.melt(var_name='Category', value_name='Value') source = ColumnDataSource(melted_df) # 创建第一个子图:柱状图 p1 = figure(x_range=melted_df['Category'], title='2013人口数据柱状图', x_axis_label='类别', y_axis_label='数值') p1.vbar(x='Category', top='Value', width=0.5, source=source, color=Spectral4) # 添加悬停交互工具 hover1 = HoverTool(tooltips=[('类别', '@Category'), ('数值', '@Value')]) p1.add_tools(hover1) # 创建第二个子图:折线+标记点图 p2 = figure(x_range=melted_df['Category'], title='2013人口数据折线图', x_axis_label='类别', y_axis_label='数值') p2.line(x='Category', y='Value', source=source, line_width=2, color=Spectral4[0]) p2.circle(x='Category', y='Value', source=source, size=10, color=Spectral4[1]) # 创建第三个子图:填充面积图 p3 = figure(x_range=melted_df['Category'], title='2013人口数据面积图', x_axis_label='类别', y_axis_label='数值') p3.varea(x='Category', y1=0, y2='Value', source=source, fill_color=Spectral4[2], alpha=0.5) # 组合子图为Gridplot布局 grid = gridplot([[p1, p2], [p3, None]], plot_width=400, plot_height=300) # 输出HTML并展示图表 output_file('population_gridplot.html') show(grid)
关键步骤说明
- 数据重塑:用
pd.melt()将原始单行多列的宽数据,转换为类别-数值的长格式,让Bokeh的图形标记能识别完整的数据序列。 - 统一数据源:通过
ColumnDataSource管理处理后的数据,既支持多子图共享数据,也方便配置交互工具。 - Gridplot布局:通过
gridplot()按行列组合子图,示例中设置为2行2列布局,空位置用None占位保证排版整齐。 - 交互优化:添加
HoverTool实现鼠标悬停显示详细数据,提升图表的可读性。
内容的提问来源于stack exchange,提问作者Dozzang
相关产品推荐
相关产品推荐

