You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:37:22