Bokeh代码中v.bar无结果,求助多语言电影Genre对比图表问题
问题排查与解决方案
常见导致v.bar无输出的原因及修复步骤
1. 确认数据已完成频次聚合
柱状图需要的是每个 Genre 对应的电影数量,而非原始的单条电影数据。先对每个 DataFrame 做 Genre 频次统计:
import pandas as pd # 对每个语言的DataFrame统计Genre频次 english_genre = english1['Genre'].value_counts().reset_index() english_genre.columns = ['Genre', 'Count'] english_genre['Language'] = 'English' french_genre = french1['Genre'].value_counts().reset_index() french_genre.columns = ['Genre', 'Count'] french_genre['Language'] = 'French' german_genre = german1['Genre'].value_counts().reset_index() german_genre.columns = ['Genre', 'Count'] german_genre['Language'] = 'German' spanish_genre = spanish1['Genre'].value_counts().reset_index() spanish_genre.columns = ['Genre', 'Count'] spanish_genre['Language'] = 'Spanish' # 合并为统一数据源 combined_data = pd.concat([english_genre, french_genre, german_genre, spanish_genre])
执行后打印combined_data,确认每个 Genre 都有对应的计数和语言标识。
2. 检查Bokeh柱状图的参数配置
多语言对比的分组柱状图需要用FactorRange定义复合X轴,确保vbar能正确识别分组:
from bokeh.plotting import figure, show from bokeh.models import ColumnDataSource, FactorRange # 构建复合X轴值:(Genre, Language) x_factors = [(row['Genre'], row['Language']) for _, row in combined_data.iterrows()] source = ColumnDataSource(data=dict( x=x_factors, count=combined_data['Count'] )) # 创建图表 p = figure( x_range=FactorRange(*x_factors), height=400, title="Movie Genre Distribution by Language", x_axis_label="Genre & Language", y_axis_label="Number of Movies" ) # 绘制柱状图 p.vbar(x='x', top='count', width=0.8, source=source) # 旋转X轴标签避免重叠 p.xaxis.major_label_orientation = 1.2 # 显示图表 show(p)
注意:vbar的参数名要和ColumnDataSource中的字段完全匹配(大小写敏感),比如top='count'要对应source里的'count'字段。
3. 排查显示环境问题
- 如果在Jupyter Notebook中运行,需先初始化Bokeh输出:
from bokeh.io import output_notebook output_notebook() - 脚本运行时,确保最后调用
show(p),否则图表不会弹出显示。
额外验证步骤
- 单独打印每个语言的统计结果(如
print(german_genre)),确认没有空值、异常值,且Genre分类格式统一(比如不要出现"Action"和"action"这种大小写差异)。 - 如果预期是堆叠柱状图,需调整
vbar的bottom参数,累加前序语言的计数实现堆叠效果。
内容的提问来源于stack exchange,提问作者Melanie Mather
相关产品推荐
相关产品推荐

