Python散点图案例如何绘制分布图表

wen python案例 27

Python散点图案例:如何绘制分布图表(完整实战指南)

📖 目录导读

  1. 为什么散点图是分布分析的核心工具?
  2. Python散点图基础:matplotlib与seaborn对比
  3. 实战案例1:二维分布散点图(含颜色映射)
  4. 实战案例2:三维散点图与密度分布叠加
  5. 实战案例3:分组散点图与统计分布同步
  6. 进阶技巧:如何提升散点图的可读性与SEO价值
  7. 常见问题FAQ

为什么散点图是分布分析的核心工具?

在数据分析领域,散点图(Scatter Plot)是最直观展示数据分布特征的图表类型,尤其适用于:

Python散点图案例如何绘制分布图表

  • 发现变量相关性:通过点的聚集模式判断正/负/无相关
  • 识别异常值:远离整体集群的孤立点
  • 观察聚类结构:自然分组现象(如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价值

  1. 规避重叠问题

    • 使用alpha透明度(0.3~0.7最佳)
    • 对大数据集使用rasterized=True(栅格化)
      plt.scatter(x, y, alpha=0.3, rasterized=True)
  2. 添加边缘分布(边际图)
    seaborn的jointplot

    sns.jointplot(data=df, x='x', y='y', kind='scatter', marginal_kws=dict(bins=30))
  3. 交互式散点图(增加页面的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')  # 可嵌入网页
  4. 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拟合曲线

抱歉,评论功能暂时关闭!