Python散点图案例:如何绘制分布图表(完整实战指南)
📖 目录导读
- 为什么散点图是分布分析的核心工具?
- Python散点图基础:matplotlib与seaborn对比
- 实战案例1:二维分布散点图(含颜色映射)
- 实战案例2:三维散点图与密度分布叠加
- 实战案例3:分组散点图与统计分布同步
- 进阶技巧:如何提升散点图的可读性与SEO价值
- 常见问题FAQ
为什么散点图是分布分析的核心工具?
在数据分析领域,散点图(Scatter Plot)是最直观展示数据分布特征的图表类型,尤其适用于:

- 发现变量相关性:通过点的聚集模式判断正/负/无相关
- 识别异常值:远离整体集群的孤立点
- 观察聚类结构:自然分组现象(如K-means聚类可视化)
核心区别:柱状图/折线图侧重趋势,散点图聚焦“点”的密度与分散性,在金融风险评估中,散点图能快速显示资产收益率与波动性的“风险-收益”分布规律。
Python散点图基础:matplotlib与seaborn对比
| 库 | 适用场景 | 核心函数 | 代码复杂度 |
|---|---|---|---|
| matplotlib | 高度自定义,全平台兼容 | scatter() |
|
| seaborn | 快速美观,自动统计分布 | scatterplot() |
基础语法对比(生成100个随机点):
# matplotlib版本
import matplotlib.pyplot as plt
x = np.random.randn(100)
y = np.random.randn(100)
plt.scatter(x, y, alpha=0.6, c='blue')
plt.xlabel('X轴变量'); plt.ylabel('Y轴变量')'matplotlib散点图')
plt.show()
# seaborn版本
import seaborn as sns
df = pd.DataFrame({'x': x, 'y': y})
sns.scatterplot(data=df, x='x', y='y', alpha=0.8)'seaborn散点图')
plt.show()
关键点:seaborn自动添加统计分布边缘(需结合jointplot),matplotlib需要手动设置alpha(透明度)避免点重叠。
实战案例1:二维分布散点图(含颜色映射)
场景:分析城市人口密度与空气质量指数的关系,并用颜色映射表示城市等级。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 构造示例数据
np.random.seed(42)
cities = ['北京','上海','广州','深圳']*25
density = np.random.randint(1000, 5000, 100) # 人口密度
aqi = np.random.randint(30, 200, 100) # 空气质量指数
levels = np.random.choice(['一级','二级','三级'], 100) # 城市等级
df = pd.DataFrame({'城市':cities,'密度':density,'AQI':aqi,'等级':levels})
# 绘制带颜色映射的散点图
plt.figure(figsize=(10,6))
colors = {'一级':'green','二级':'orange','三级':'red'}
for level in df['等级'].unique():
subset = df[df['等级']==level]
plt.scatter(subset['密度'], subset['AQI'],
c=colors[level], label=level, alpha=0.7, s=50)
plt.xlabel('人口密度(人/平方公里)', fontsize=12)
plt.ylabel('空气质量指数(AQI)', fontsize=12)'城市人口密度与空气质量分布关系', fontsize=14)
plt.legend(title='城市等级')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
解读:绿色点(一级)多集中在密度适中、AQI较低区域;红色点(三级)在密度高或AQI高区域呈离散分布,说明城市等级与污染程度存在关联。
实战案例2:三维散点图与密度分布叠加
目标:当数据具备三个连续变量时,用三维散点图观察立体分布,并叠加边缘密度图。
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import gaussian_kde
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111, projection='3d')
# 生成三维数据
x = np.random.normal(0, 1, 500)
y = np.random.normal(0, 1, 500)
z = np.random.normal(0, 1, 500)
# 计算密度以控制点大小
xyz = np.vstack([x, y, z])
kde = gaussian_kde(xyz)
density = kde(xyz)
# 绘制三维散点图
sc = ax.scatter(x, y, z, c=density, s=20*density, cmap='viridis', alpha=0.6)
plt.colorbar(sc, ax=ax, label='密度值')
ax.set_xlabel('X'); ax.set_ylabel('Y'); ax.set_zlabel('Z')
ax.set_title('三维散点图+密度分布(点大小与密度相关)')
plt.show()
关键点:通过gaussian_kde计算核密度估计,使高密度区域点更大、颜色更明亮,直观显示数据集群。
实战案例3:分组散点图与统计分布同步
场景:对比不同类别的数据分布,同时显示其统计特征(如均值、中位数、分位数)。
import seaborn as sns
import matplotlib.pyplot as plt
# 使用seaborn内置数据集
df = sns.load_dataset('iris')
# 创建分组散点图+提琴图
fig, axes = plt.subplots(1, 2, figsize=(14,5))
# 左侧:分组散点图
sns.scatterplot(data=df, x='sepal_length', y='petal_length',
hue='species', style='species', s=60, ax=axes[0])
axes[0].set_title('鸢尾花花瓣长度与花萼长度分布')
# 右侧:小提琴图+散点图叠加
sns.violinplot(data=df, x='species', y='sepal_length',
inner='box', cut=0, ax=axes[1])
sns.stripplot(data=df, x='species', y='sepal_length',
color='black', alpha=0.5, jitter=True, ax=axes[1])
axes[1].set_title('花萼长度分布统计')
plt.tight_layout()
plt.show()
优势:左侧散点图显示个体分布;右侧小提琴图展示密度体形,内部箱线图显示中位数和四分位数,散点通过jitter避免重叠。
进阶技巧:如何提升散点图的可读性与SEO价值
-
规避重叠问题
- 使用
alpha透明度(0.3~0.7最佳) - 对大数据集使用
rasterized=True(栅格化)plt.scatter(x, y, alpha=0.3, rasterized=True)
- 使用
-
添加边缘分布(边际图)
seaborn的jointplot:sns.jointplot(data=df, x='x', y='y', kind='scatter', marginal_kws=dict(bins=30))
-
交互式散点图(增加页面的UX深度)
import plotly.express as px fig = px.scatter(df, x='x', y='y', color='category', hover_data=['info'], size_max=15) fig.write_html('scatter_plotly.html') # 可嵌入网页 -
SEO优化建议
- 图表
alt属性描述数据分布特征:<img src="scatter.png" > - 文章内嵌代码块设置
lang="python",提高技术内容爬虫识别度 - 使用结构化数据标记图表:
<script type="application/ld+json">{"@context":"https://schema.org","@type":"VisualArtwork","name":"城市等级散点图"...}</script>
- 图表
常见问题FAQ
Q1:散点图点太多导致全黑怎么办?
A:使用alpha(如alpha=0.1)或采样(df.sample(1000)),或者改用hexbin六边形分箱图(plt.hexbin(x,y,gridsize=30))。
Q2:如何科学选择图表类型?
- 二维连续变量:散点图
- 三维连续变量:3D散点图或泡泡图(用点大小表示第三维)
- 类别+连续:分组散点图/蜂群图(swarmplot)
- 大数据分布:核密度图(kdeplot)+散点背景
Q3:seaborn和matplotlib哪个更适合SEO内容展示?
A:seaborn适合快速成图(减少代码量便于读者理解);matplotlib适合需要精确控制布局(如多子图组合)的场景,建议正文使用seaborn,注释中提供matplotlib等效代码,覆盖两种读者需求。
Q4:散点图能否用于时间序列分布?
A:可以,将时间转换为数值(如时间戳),或用x='datetime',但需注意时间序列通常用折线图更清晰,散点图适合展示时间上的聚类(如节假日消费模式)。
延伸阅读:
- 若需要空间分布散点图,可结合
geopandas在地图上绘制散点(如人口分布热力图) - 对于连续变量间的非线性关系预测,可叠加
scipy.optimize.curve_fit拟合曲线