数据可视化-13. 密度图

目录

1. 密度图介绍

2. 密度图种类

2.1 一维密度图(1D Density Plot)

2.3 叠加密度图(Overlapping Density Plot)

2.4 堆叠密度图(Stacked Density Plot)

2.5 核密度估计图(Kernel Density Estimation, KDE)

2.6 多峰密度图(Multi-modal Density Plot)

2.7 半透明密度图(Transparent Density Plot)

4.密度图局限性

5.密度图代码实现

5.1 Python 代码实现

5.2 密度图效果(网页展示)


1. 密度图介绍

        密度图(Density Plot),也称为概率密度图或核密度估计图(Kernel Density Estimate, KDE),它通过计算数据的密度估计来描绘数据在数值范围内的分布情况,是一种用于展示数据分布的平滑曲线图,能够直观地显示出数据在不同区间的聚集程度和变化趋势。

        它是直方图的一种替代方法,但比直方图更平滑,适合展示数据分布的连续趋势。

        一般说来,密度图通过核密度估计方法,将数据点分布转换为连续的概率密度函数(PDF)。其基本原理包括以下步骤:

  • 核函数(Kernel Function):每个数据点被视为一个分布,通过核函数(通常是高斯核)生成局部密度。核函数的作用是平滑数据,避免直方图的分箱问题。

  • 带宽(Bandwidth):带宽决定了核函数的宽度,也影响平滑程度。带宽小:保留更多细节,但可能产生噪声;带宽大:平滑程度高,但可能掩盖细节。

  •  密度图的纵轴表示密度(或概率密度),横轴表示数据的取值范围。

2. 密度图种类

        密度图有很多种类,先说常见的几种:

2.1 一维密度图(1D Density Plot)

        一维密度图展示单个连续变量的数据分布,曲线表示该变量的概率密度。

2.2 二维密度图(2D Density Plot)

        二维密度图用于展示两个连续变量之间的联合分布,通常以等高线图(Contours)或热力图(Heatmaps)的形式呈现。等高线密度图:用线条表示密度水平。热力密度图:用颜色深浅表示密度大小。

2.3 叠加密度图(Overlapping Density Plot)

        叠加密度图多将个数据集的密度图叠加在一张图上,用于比较分布,方便比较不同组数据的分布特性或者识别组间的相似性或差异。但是叠加过多组时可能会导致图表过于复杂,颜色或透明度的选择很重要。一般建议不超过4组。

2.4 堆叠密度图(Stacked Density Plot)

        堆叠密度图将多个密度图堆叠起来,展示每组数据在整体分布中的贡献。可以直观了解分组数据的分布叠加效果或者分析组间数据的相对比例。

叠加密度图和堆叠密度图的对比总结

维度叠加密度图堆叠密度图
展示方式       
 
曲线直接叠加,用透明度或线型区分 曲线堆叠,展示每组数据对整体的贡献
高度含义        每组曲线高度独立,表示单组密度每组曲线高度与其他组叠加,表示总密度
适用场景        
 
强调各组数据的分布特性和形状强调各组数据在整体分布中的比例
组数限制    
 
适合组数较少(2~4 组)   适合组数较多(5 组及以上)
透明度要求        
 
需要设置透明度以避免重叠区域过于杂乱无需透明度,组间分布清晰
整体分布    不反映整体分布    反映整体分布

2.5 核密度估计图(Kernel Density Estimation, KDE)

        KDE 是基于核密度估计算法绘制的密度图,平滑度由带宽(Bandwidth)控制。替代直方图,用于分析平滑的分布,或者通过调整带宽观察分布的细节或整体趋势。

2.6 多峰密度图(Multi-modal Density Plot)

        多峰密度图展示数据分布中的多个高峰区域,常用于反映分组或混合分布或者帮助识别潜在的子群或模式。

2.7 半透明密度图(Transparent Density Plot)

        只是通过设置透明度,便于叠加多组数据而不失去清晰度。常常用于重叠较多的分布图,清晰展示局部密度变化。

3. 密度图适用场景

        密度图适用于数据分布分析、多组数据的分布比较、数据分布与总体趋势的理解​​​​​​​、数据建模与预测​​​​​​​、数据采样与概率分析等场景

4.密度图局限性

        密度图对带宽(Bandwidth)敏感,选择不合适的带宽会影响密度图的准确性,进而影响对数据分布的解读;对数据量依赖较大,数据量小可能导致密度图平滑不足,无法反映真实的分布;难以处理离散数据、难以解释复杂分布,易受异常值影响,无法展示数据的实际频率;显示过于平滑,可能忽略局部特征,最重要的是大规模数据集时候计算开销较大。

5.密度图代码实现

5.1 Python 代码实现

        Dash 是一个非常非常好用的模块!!!

import dash
from dash import html, dcc, Input, Output
import plotly.graph_objects as go
import dash_bootstrap_components as dbc
import numpy as np
import plotly.express as px

def create_density_plots():
    """
    创建各种密度图示例
    返回一个包含多个密度图的列表
    """
    # 示例数据
    np.random.seed(42)
    x = np.random.normal(loc=0, scale=1, size=1000)
    y = np.random.normal(loc=0, scale=1, size=1000)

    # 1. 一维密度图
    one_d_density_fig = px.density_contour(x=x, marginal_x="histogram")
    one_d_density_fig.update_layout(title='一维密度图')

    # 2. 二维密度图
    two_d_density_fig = px.density_contour(x=x, y=y)
    two_d_density_fig.update_layout(title='二维密度图')

    # 3. 叠加密度图
    overlay_density_fig = go.Figure()
    overlay_density_fig.add_trace(go.Histogram(x=x, histnorm='probability density', opacity=0.5, name='X'))
    overlay_density_fig.add_trace(go.Histogram(x=y, histnorm='probability density', opacity=0.5, name='Y'))
    overlay_density_fig.update_layout(title='叠加密度图')

    # 4. 堆叠密度图
    stacked_density_fig = go.Figure()
    stacked_density_fig.add_trace(go.Histogram(x=x, histnorm='probability density', cumulative_enabled=True, name='X'))
    stacked_density_fig.add_trace(go.Histogram(x=y, histnorm='probability density', cumulative_enabled=True, name='Y'))
    stacked_density_fig.update_layout(title='堆叠密度图')

    # 5. 核密度估计图
    kde_fig = px.density_contour(x=x, y=y, marginal_x="histogram", marginal_y="histogram")
    kde_fig.update_layout(title='核密度估计图')

    # 6. 多峰密度图
    multi_peak_density_fig = px.density_contour(x=np.concatenate([x, x + 5]), y=np.concatenate([y, y + 5]))
    multi_peak_density_fig.update_layout(title='多峰密度图')

    # 7. 半透明密度图
    semi_transparent_density_fig = go.Figure()
    semi_transparent_density_fig.add_trace(go.Histogram(x=x, histnorm='probability density', opacity=0.3, name='X'))
    semi_transparent_density_fig.add_trace(go.Histogram(x=y, histnorm='probability density', opacity=0.3, name='Y'))
    semi_transparent_density_fig.update_layout(title='半透明密度图')

    return [
        one_d_density_fig, two_d_density_fig, overlay_density_fig, stacked_density_fig,
        kde_fig, multi_peak_density_fig, semi_transparent_density_fig
    ]

app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])

density_plots = create_density_plots()

app.layout = html.Div([
    html.H3("密度图展示", className="text-center mt-4 mb-3"),
    dbc.Row([dbc.Col(dcc.Graph(figure=fig), width=6) for fig in density_plots])
])

if __name__ == "__main__":
    app.run_server(debug=True, port=8051)

5.2 密度图效果(网页展示)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南野栀子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值