Python 如何使用Bokeh库在Python中可视化堆叠条形图?
Bokeh是一个Python库,用于构建交互性和高度可定制的数据可视化工具。它支持多种类型的图表,包括堆叠条形图。
在本教程中,我们将使用Bokeh库来创建一个堆叠条形图,以比较两个组的数据。具体来说,我们将显示每个组中的三个项目,并在每个项目上堆叠每个组的数据。我们将展示如何创建这个图表、如何设置轴标签和图例,并如何使用样式设置来自定义颜色。
阅读更多:Python 教程
准备工作
首先,你需要安装Bokeh库并确保其在你的Python环境中可用。如果你使用的是Anaconda环境,你可以通过以下命令来安装Bokeh库:
conda install bokeh
否则,你可以尝试使用pip安装:
pip install bokeh
创建数据
下一步是创建需要可视化的数据。我们的数据包含两个组(group1和group2),每个组都有三个项目(project1、project2和project3)。下面是创建这些数据的代码:
import pandas as pd
import numpy as np
# 创建数据
group1 = pd.DataFrame({'project1': np.random.randint(10, 20, size=3),
'project2': np.random.randint(20, 30, size=3),
'project3': np.random.randint(10, 20, size=3)},
index=['A', 'B', 'C'])
group2 = pd.DataFrame({'project1': np.random.randint(20, 30, size=3),
'project2': np.random.randint(10, 20, size=3),
'project3': np.random.randint(20, 30, size=3)},
index=['A', 'B', 'C'])
我们使用Pandas创建两个DataFrame,每个DataFrame代表一个组。DataFrame包含三列,每列代表一个项目。对于每个组和每个项目,我们使用numpy.random.randint函数生成一个随机整数。最后,我们使用index参数来为每个组指定标签。
创建堆叠条形图
现在我们可以开始创建堆叠条形图。首先,我们需要将每个项目的数据堆叠在一起,以便它们可以被绘制在同一根条形图上。我们可以将每个组的DataFrame转换为包含一个索引的列的DataFrame,然后使用Pandas的stack函数将所有项目堆叠在一起。
# 堆叠DataFrame
stacked1 = group1.stack().reset_index()
stacked2 = group2.stack().reset_index()
# 设置DataFrames的列名
stacked1.columns = ['idx', 'project', 'value']
stacked2.columns = ['idx', 'project', 'value']
现在,我们可以使用Bokeh库创建图表。我们将使用vbar_stack()函数创建一个堆叠条形图。该函数接受以下参数:
- x:一个包含所有条形的x坐标的列表(在我们的情况下,这是每个项目)
- top:每个项目的顶部坐标的列表,其中顶部由所有堆叠数据的总和确定
- color:一个字符串或RGB元祖,用于为每个堆叠的组设置颜色
- legend_label:每个堆叠组的标签,用于显示在图例中
- width:每个条形的宽度
- source:一个包含数据的数据源,它应该包含x,top和color列。
下面是我们的代码:
from bokeh.io import show
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
# 设置x坐标
projects = ['project1', 'project2', 'project3']
x = [(project, group) for project in projects for group in ['group1', 'group2']]
# 设置每个项目的高度top = np.concatenate([stacked1['value'].values, stacked2['value'].values])
# 设置每个堆叠的组的颜色和标签
colors = ['#c9d9d3', '#718dbf']
group_labels = ['Group 1', 'Group 2']
# 创建数据源
source = ColumnDataSource(data=dict(x=x, top=top, color=colors * len(projects),
legend_label=(group_labels * len(projects))))
# 创建堆叠条形图
p = figure(x_range=projects, plot_height=400, title="Stacked Bar Chart",
toolbar_location=None, tools="")
p.vbar_stack(stackers=['color'], x='x', width=0.9, top='top', source=source,
legend_label='legend_label', muted_color='color', muted_alpha=0.2)
# 设置轴标签
p.xaxis.axis_label = 'Projects'
p.yaxis.axis_label = 'Value'
# 设置图例
p.legend.location = "top_left"
p.legend.click_policy = 'mute'
# 输出图形
show(p)
在此代码中,我们首先设置了包含所有项目和所有组的x坐标。我们使用numpy的concatenate函数将两个组的堆叠数据合并为一个顶部列表。
接下来,我们设置堆叠组的颜色和标签,并使用这些信息、高度和x坐标创建一个数据源。最后,我们使用vbar_stack函数创建堆叠条形图,并设置轴标签和图例。
自定义样式
我们还可以使用样式选项来自定义条形图的外观。例如,我们可以使用以下代码为每个项目设置不同的填充颜色:
# 创建自定义颜色代码
project_colors = {
'project1': '#718dbf',
'project2': '#e84d60',
'project3': '#c9d9d3'
}
# 更新数据源颜色列
source.data['color'] = [project_colors[project] for project, group in x] * 2
# 创建堆叠条形图
p = figure(x_range=projects, plot_height=400, title="Stacked Bar Chart",
toolbar_location=None, tools="")
p.vbar_stack(stackers=['color'], x='x', width=0.9, top='top', source=source,
legend_label='legend_label', muted_color='color', muted_alpha=0.2,
fill_color='color')
# 设置轴标签
p.xaxis.axis_label = 'Projects'
p.yaxis.axis_label = 'Value'
# 设置图例
p.legend.location = "top_left"
p.legend.click_policy = 'mute'
# 输出图形
show(p)
在此代码中,我们创建了一个字典来保存每个项目的自定义颜色,并使用该颜色修饰条形填充颜色。另外,我们还添加了一个fill_color参数来设置堆叠数据的颜色。
结论
在本教程中,我们向你介绍了如何使用Bokeh库在Python中创建堆叠条形图。我们了解了如何准备数据、创建堆叠数据、创建条形图并设置轴标签和图例。我们还通过自定义填充颜色来演示了如何使用样式选项。使用这些知识,你可以开始探索Bokeh库中的其他图表类型和选项,以创建更多样化的数据可视化。
极客笔记