实验概述
实验名称:关系数据的可视化
实验目的:
- 掌握关系数据在大数据中的应用场景
- 掌握常见关系数据可视化方法
- 使用Python实现多维数据关联分析
一、环境准备
【实验环境】
OS:Windows
python:v3.6
数据源:

安装Python所需要的第三方模块
pip install seaborn
#进行环境配置
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import cm # 动态散点图颜色映射
二、核心实验内容
实验1:联合分布图分析
目标:探究谋杀与入室盗窃犯罪率的关联性
技术亮点:
- 三图合一的联合分布展示
- 线性回归趋势线叠加
- 相关系数动态标注
# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 读取数据
file_path = r"C:\Users\二狗王\Documents\Downloads\crimeRatesByState2005.csv"
df = pd.read_csv(file_path)
# 计算相关系数
correlation = df[['murder', 'burglary']].corr().iloc[0, 1]
# 创建联合分布图
g = sns.jointplot(
data=df,
x='murder',
y='burglary',
kind='reg', # 使用回归图代替散点图
height=8, # 图形高度
ratio=5, # 主图与边缘图的比例
space=0.2, # 主图与边缘图的间距
marginal_kws={
'kde': True, # 边缘图显示核密度估计
'color': 'lightblue' # 边缘图颜色
},
scatter_kws={
'color': 'darkblue', # 散点颜色
'alpha': 0.7, # 散点透明度
's': 50 # 散点大小
},
line_kws={
'color': 'red', # 回归线颜色
'linewidth': 2 # 回归线宽度
}
)
# 添加标题和相关系数
g.fig.suptitle(f"谋杀与入室盗窃犯罪率相关性分析\n相关系数: {correlation:.2f}", fontsize=16, fontweight='bold', y=1.02)
plt.tight_layout()
# 显示图形
plt.show()
输出如下所示:

可视化解读:
- 主图:散点图+回归线展示线性趋势
- 上方/右侧:核密度曲线揭示单变量分布
- 颜色映射:冷色调增强数据层次感
实验2:动态散点图分析
技术突破:时序维度可视化
代码亮点:
- 数据点逐帧加载动画
- 颜色映射反映数值变化
- 支持生成可交互GIF
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import cm
# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 读取数据
file_path = r"C:\Users\二狗王\Documents\Downloads\crimeRatesByState2005.csv"
df = pd.read_csv(file_path)
# 提取数据
x_data = df['murder']
y_data = df['burglary']
# 创建图形和轴
fig, ax = plt.subplots(figsize=(10, 6))
sc = ax.scatter([], [], c=[], cmap=cm.coolwarm, alpha=0.8, edgecolor='k', s=100)
ax.set_xlim(0, x_data.max() + 1)
ax.set_ylim(0, y_data.max() + 200)
ax.set_xlabel("谋杀犯罪率 (murder)", fontsize=14)
ax.set_ylabel("入室盗窃犯罪率 (burglary)", fontsize=14)
ax.set_title("谋杀与入室盗窃犯罪率动态散点图", fontsize=16, fontweight='bold')
ax.grid(color='gray', linestyle='--', linewidth=0.5, alpha=0.7)
# 动态更新函数
def update(frame):
current_data = df.iloc[:frame]
sc.set_offsets(current_data[['murder', 'burglary']].values)
sc.set_array(current_data['murder']) # 用谋杀犯罪率控制颜色
return sc,
# 创建动画
ani = FuncAnimation(fig, update, frames=len(df), interval=200, repeat=False)
# 保存动画为 GIF 文件
ani.save("dynamic_scatter.gif", writer="pillow", fps=5)
# 显示动画
plt.show()
输出如下所示:

动态特性:
- 颜色渐变反映犯罪率强度变化
- 逐点加载观察数据分布过程
- 支持导出为可分享的GIF文件
实验3:散点图矩阵
技术价值:多维关系并行分析
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 数据文件路径
file_path = r"C:\Users\二狗王\Documents\Downloads\crimeRatesByState2005.csv"
# 读取数据
df = pd.read_csv(file_path)
# 剔除 United States 和 District of Columbia 两行
df = df[~df['state'].isin(['United States', 'District of Columbia'])]
# 选择七种犯罪类型字段
crime_types = [
'murder',
'forcible_rape',
'robbery',
'aggravated_assault',
'burglary',
'larceny_theft',
'motor_vehicle_theft'
]
# 取出相关列
df_crime = df[crime_types]
# 设置绘图风格
sns.set(style='whitegrid', palette='muted', font_scale=1.2)
# 绘制散点图矩阵
g = sns.pairplot(df_crime, kind='scatter', diag_kind='kde', plot_kws={'alpha':0.6, 's':40})
# 增加标题
plt.suptitle('2005年美国各州七种犯罪类型之间的相关关系散点图矩阵', y=1.02, fontsize=16)
# 调整布局
plt.tight_layout()
plt.show()
输出如下所示:

交互优势:
- 对角线展示单变量核密度分布
- 非对角散点图揭示双变量关系
- 支持快速定位异常数据点
实验4:犯罪类型关联热力图
创新点:矩阵式相关性强度呈现
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体(避免中文乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据(注意路径转义)
file_path = r"C:\Users\二狗王\Documents\Downloads\crimeRatesByState2005.csv"
df = pd.read_csv(file_path)
# 剔除异常数据行
df_clean = df[(df['state'] != 'United States') & (df['state'] != 'District of Columbia')]
# 选取七种犯罪类型列
crime_columns = [
'murder',
'forcible_rape',
'robbery',
'aggravated_assault',
'burglary',
'larceny_theft',
'motor_vehicle_theft'
]
# 计算相关系数矩阵
corr_matrix = df_clean[crime_columns].corr()
# 设置画布尺寸
plt.figure(figsize=(12, 10))
# 创建热力图
heatmap = sns.heatmap(
corr_matrix,
annot=True, # 显示相关系数数值
fmt=".2f", # 数值格式
cmap='coolwarm', # 颜色映射方案
vmin=-1, vmax=1, # 数值范围
linewidths=0.5, # 单元格间隔线宽
annot_kws={'size': 10}, # 注释字体大小
cbar_kws={"shrink": 0.8} # 颜色条尺寸
)
# 美化图形
heatmap.set_xticklabels(
heatmap.get_xticklabels(),
rotation=45, # 标签旋转角度
ha='right', # 水平对齐方式
fontsize=12
)
heatmap.set_yticklabels(
heatmap.get_yticklabels(),
fontsize=12
)
# 添加标题和装饰
plt.title('美国各州七种犯罪类型相关性热力图', fontsize=16, pad=20)
heatmap.figure.subplots_adjust(top=0.9) # 调整标题位置
# 显示图形
plt.tight_layout()
plt.show()
输出如下所示:

分析结论:
- 红色区块表示强正相关(如抢劫与严重攻击)
- 蓝色区块显示负相关关系
- 白色系为弱相关区域
三、实验总结
方法论收获:
- 静态可视化侧重数据快照分析
- 动态可视化增强时序感知
- 矩阵类图表适合高维数据分析
信息洞察:
- 盗窃类犯罪呈现强正相关
- 谋杀与车辆盗窃相关性较低
- 数据清洗对结果可靠性至关重要
注意事项:
- 动态可视化需安装
pillow库:pip install pillow - 中文字体设置需匹配操作系统
- 热力图数值保留两位小数增强可读性

7万+

被折叠的 条评论
为什么被折叠?



