Bokeh项目实战:使用Bokeh创建专业级柱状图可视化
柱状图是数据可视化中最常用的图表类型之一,它能直观地展示分类数据与数值数据之间的关系。本文将全面介绍如何使用Bokeh这一强大的Python可视化库来创建各种类型的柱状图。
1. 基础柱状图
在Bokeh中创建基础柱状图非常简单,主要使用hbar()
(水平柱状图)和vbar()
(垂直柱状图)两种方法。
1.1 分类数据准备
Bokeh支持处理分类数据,这些数据可以是简单的字符串序列:
fruits = ['苹果', '梨子', '油桃', '李子', '葡萄', '草莓']
也可以是层次化的嵌套结构:
季度月份 = [
("一季度", "1月"), ("一季度", "2月"), ("一季度", "3月"),
("二季度", "4月"), ("二季度", "5月"), ("二季度", "6月"),
("三季度", "7月"), ("三季度", "8月"), ("三季度", "9月"),
("四季度", "10月"), ("四季度", "11月"), ("四季度", "12月"),
]
1.2 创建基础柱状图
from bokeh.plotting import figure, show
# 准备数据
水果 = ['苹果', '梨子', '油桃', '李子', '葡萄', '草莓']
销量 = [5, 3, 4, 2, 4, 6]
# 创建图表
p = figure(x_range=水果, height=350, title="水果销量")
p.vbar(x=水果, top=销量, width=0.9)
show(p)
2. 柱状图高级功能
2.1 排序功能
为了让数据展示更加直观,我们经常需要对柱状图进行排序:
# 按销量排序
排序后的数据 = sorted(zip(水果, 销量), key=lambda x: x[1])
水果排序 = [x[0] for x in 排序后的数据]
销量排序 = [x[1] for x in 排序后的数据]
p = figure(x_range=水果排序, height=350, title="水果销量(排序)")
p.vbar(x=水果排序, top=销量排序, width=0.9)
2.2 颜色填充
Bokeh提供了多种方式来设置柱状图的颜色:
方法一:直接指定颜色列
from bokeh.models import ColumnDataSource
数据 = {
'水果': 水果,
'销量': 销量,
'颜色': ['#3288bd', '#99d594', '#e6f598', '#fee08b', '#fc8d59', '#d53e4f']
}
源 = ColumnDataSource(数据)
p.vbar(x='水果', top='销量', width=0.9, color='颜色', source=源)
方法二:使用颜色映射器
from bokeh.transform import factor_cmap
颜色映射 = factor_cmap('水果', palette='Spectral6', factors=水果)
p.vbar(x='水果', top='销量', width=0.9, color=颜色映射, source=源)
3. 堆叠柱状图
当需要展示多个数据系列时,堆叠柱状图是一个很好的选择:
年份 = ['2019', '2020', '2021']
数据 = {
'水果': 水果,
'2019': [2, 1, 4, 3, 2, 4],
'2020': [5, 3, 4, 2, 4, 6],
'2021': [3, 2, 4, 4, 5, 3]
}
源 = ColumnDataSource(数据)
p = figure(x_range=水果, height=350, title="水果销量年度对比")
p.vbar_stack(年份, x='水果', width=0.9, color=['#3182bd', '#6baed6', '#9ecae1'], source=源)
4. 分组柱状图
4.1 嵌套分类
from bokeh.transform import factor_cmap
年份 = ['2019', '2020', '2021']
数据 = {
'水果年份': [(f, y) for f in 水果 for y in 年份],
'销量': [2,5,3,1,3,2,4,4,4,3,2,4,2,4,5,4,6,3]
}
源 = ColumnDataSource(数据)
p = figure(x_range=FactorRange(*数据['水果年份']), height=350)
颜色映射 = factor_cmap('水果年份', palette=['#3182bd', '#6baed6', '#9ecae1'], factors=年份, start=1, end=2)
p.vbar(x='水果年份', top='销量', width=0.9, source=源, line_color="white", fill_color=颜色映射)
4.2 视觉偏移
from bokeh.transform import dodge
源 = ColumnDataSource(数据)
p = figure(x_range=水果, height=350)
# 为每个年份创建偏移的柱状图
年份偏移 = {'2019': -0.3, '2020': 0, '2021': 0.3}
for 年, 颜色 in zip(年份, ['#3182bd', '#6baed6', '#9ecae1']):
p.vbar(x=dodge('水果', 年份偏移[年], range=p.x_range), top=年, width=0.2,
source=源, color=颜色, legend_label=年)
5. 区间柱状图
柱状图不仅可以表示单一数值,还可以表示区间范围:
数据 = {
'年份': ['2016', '2017', '2018', '2019', '2020'],
'最小值': [9.5, 9.7, 9.6, 9.8, 9.9],
'最大值': [10.2, 10.1, 10.3, 10.0, 10.4]
}
p = figure(y_range=数据['年份'], height=350, x_axis_label="时间(秒)")
p.hbar(y='年份', left='最小值', right='最大值', height=0.5, source=ColumnDataSource(数据))
6. 与Pandas集成
Bokeh与Pandas有很好的集成,可以方便地处理复杂数据:
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'制造商': ['A', 'A', 'B', 'B', 'C', 'C'],
'气缸数': [4, 6, 4, 6, 4, 6],
'油耗': [28, 22, 26, 20, 30, 24]
})
# 按气缸数分组
分组 = df.groupby('气缸数')
源 = ColumnDataSource(分组)
p = figure(x_range=分组, height=350)
p.vbar(x='气缸数', top='油耗_mean', width=0.9, source=源)
总结
本文详细介绍了使用Bokeh创建各种柱状图的方法,包括:
- 基础柱状图创建
- 排序和颜色设置技巧
- 堆叠和分组柱状图的实现
- 区间柱状图的应用
- 与Pandas的集成使用
Bokeh提供了丰富的功能和灵活的API,可以满足从简单到复杂的各种柱状图需求。通过掌握这些技巧,你可以创建出专业级的数据可视化图表。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考