Bokeh项目实战:使用Anscombe四重奏数据集展示数据可视化技巧
概述
Anscombe四重奏(Anscombe's Quartet)是统计学中一个经典的示例,它由四个数据集组成,这些数据集在统计指标上几乎完全相同,但在图表上却呈现出完全不同的形态。本文将介绍如何使用Bokeh库来可视化这一经典数据集,并深入分析其实现原理。
Anscombe四重奏简介
Anscombe四重奏由统计学家Francis Anscombe于1973年提出,旨在强调数据可视化在统计分析中的重要性。这四个数据集具有以下相同的统计特性:
- 每个数据集的x值平均数都是9.0
- 每个数据集的y值平均数都是7.5
- 每个数据集的x和y的线性回归方程都是y=3+0.5x
- 每个数据集的相关系数都是0.816
然而,当我们将这些数据可视化后,会发现它们呈现出完全不同的分布模式。
Bokeh实现详解
1. 数据准备
首先,我们导入必要的库和数据集:
import numpy as np
from bokeh.io import show
from bokeh.layouts import column, gridplot
from bokeh.models import (ColumnDataSource, Div, Grid, Line,
LinearAxis, Plot, Range1d, Scatter)
from bokeh.sampledata.anscombe import data as df
Bokeh提供了内置的Anscombe数据集,可以直接导入使用。
2. 数据源设置
我们创建两个数据源:
circle_source
:包含原始数据点line_source
:包含线性回归线数据
circle_source = ColumnDataSource(data=df)
x = np.linspace(-0.5, 20.5, 10)
y = 3 + 0.5 * x
line_source = ColumnDataSource(data=dict(x=x, y=y))
3. 绘图函数设计
我们定义了一个make_plot
函数来创建每个子图:
def make_plot(title, xname, yname):
plot = Plot(x_range=rng, y_range=rng, width=400, height=400,
background_fill_color='#efefef')
plot.title.text = title
# 添加坐标轴
xaxis = LinearAxis(axis_line_color=None)
plot.add_layout(xaxis, 'below')
yaxis = LinearAxis(axis_line_color=None)
plot.add_layout(yaxis, 'left')
# 添加网格线
plot.add_layout(Grid(dimension=0, ticker=xaxis.ticker))
plot.add_layout(Grid(dimension=1, ticker=yaxis.ticker))
# 添加回归线
line = Line(x='x', y='y', line_color="#666699", line_width=2)
plot.add_glyph(line_source, line)
# 添加数据点
circle = Scatter(x=xname, y=yname, size=12, line_color="#cc6633",
fill_color="#cc6633", fill_alpha=0.5)
plot.add_glyph(circle_source, circle)
return plot
4. 创建四个子图
使用上述函数创建四个子图:
I = make_plot('I', 'Ix', 'Iy')
II = make_plot('II', 'IIx', 'IIy')
III = make_plot('III', 'IIIx', 'IIIy')
IV = make_plot('IV', 'IVx', 'IVy')
5. 布局设计
使用gridplot
将四个图表排列成2×2的网格:
grid = gridplot([[I, II], [III, IV]], toolbar_location=None)
6. 添加说明文本
使用Div
组件添加解释性文本:
div = Div(text="""
<h1>Anscombe's Quartet</h1>
<p>Anscombe's Quartet is a collection of four small datasets that have nearly
identical simple descriptive statistics (mean, variance, correlation, and
linear regression lines), yet appear very different when graphed.
</p>
""")
7. 最终展示
将文本和图表组合在一起展示:
show(column(div, grid, sizing_mode="scale_width"))
技术要点解析
-
低层级API使用:这个示例展示了Bokeh的低层级
bokeh.models
API的使用,相比高层级API,它提供了更精细的控制能力。 -
布局系统:使用了
gridplot
和column
两种布局方式,展示了Bokeh强大的布局能力。 -
数据绑定:通过
ColumnDataSource
实现了数据与图表的绑定,这是Bokeh的核心概念之一。 -
可视化组件:使用了
Line
和Scatter
两种图形标记,分别表示回归线和数据点。
教学意义
这个示例完美地展示了为什么在数据分析中不能仅仅依赖统计指标:
- 数据集I:呈现典型的线性关系
- 数据集II:呈现非线性关系
- 数据集III:存在一个异常值
- 数据集IV:x值几乎相同,只有一个异常点
通过Bokeh的可视化,我们可以直观地看到这些差异,而这是单纯看统计数字无法获得的洞察。
总结
通过这个示例,我们不仅学习了如何使用Bokeh创建复杂的可视化布局,更重要的是理解了数据可视化在统计分析中的重要性。Bokeh提供的灵活API和强大功能,使得我们可以轻松创建专业级的数据可视化作品。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考