查看原文
其他

可视化神器Plotly玩转直方图

Peter 尤而小屋 2022-05-28

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

统计图形中有一个图形叫做直方图,包含一维直方图和二维直方图(也叫做密度直方图);本文先介绍一维直方图的制作,主要还是基于两种方法的实现:

  • 基于plotly_express
  • 基于plotly.graph_objects

一、Plotly系列

Plotly的文章会形成连载系列,前面11篇Plotly可视化文章分别是:

二、直方图效果

引用一段网上对直方图的定义:




直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 


一般用横轴表示数据类型,纵轴表示分布情况。 直方图的两个坐标分别是统计样本和该样本对应的某个属性的度量,以长条图(bar)的形式具体表现。


看看本文中某个直方图绘制的实际效果:


三、模拟数据

本文中的图形的绘制主要是基于Plotly中自带的消费数据集tips,主要的字段包含:

  • 消费总金额:total_bill
  • 小费:tip
  • 付款人性别:sex
  • 付款人是否抽烟:smoker
  • 日期:day
  • 就餐时间:time,午餐还是晚餐
  • 就餐人数:size
import plotly.express as px
import numpy as np
import plotly.graph_objects as go

tips = px.data.tips()
tips.head()

四、基于plotly_express实现

4.1 基础直方图

fig = px.histogram(tips, x="total_bill")
fig.show()

4.2 设置直方图部分元素

fig = px.histogram(
    tips, 
    x="tip",
    title='设置直方图元素',   # 标题
    labels={'tip':'小费'},   # x轴label设置
    opacity=0.8,  # 图形透明度
    log_y=True,  # 取值的对数 
    color_discrete_sequence=['firebrick'# 颜色选择
    )

fig.show()

4.3 使用字段的分类值作为x轴

上面的例子中我们看到x轴的数据都是数值型的,其实我们也可以使用不同的分类作为x轴的label标签:

fig = px.histogram(  # 直方图中自动统计出现的个数
    tips, 
    x="day")

fig.show()

4.4 自定义区块个数bins

fig = px.histogram(
    tips, 
    x="total_bill"
    nbins=20)  # 对应字段的个数自定义块的个数

fig.show()

4.5 图形标准化方式选择

针对每个直方图有多种不同的标准化方式:

'percent''probability''density''probability density'
fig = px.histogram(
   tips, 
   x="total_bill"
   histnorm='percent'  # 选择标准化方式
)

fig.show()

4.6 分组直方图

根据字段的不同取值将直方图进行分组绘制;day字段有4种不同的取值:

fig = px.histogram(
    tips, 
    x="total_bill"
    color="day")  # day属性有4种取值

fig.show()
fig = px.histogram(
    tips, 
    x="tip"
    color="sex")  # sex属性有2种取值

fig.show()

4.7 不同聚合函数使用

直方图中默认使用的聚合函数是count,可以使用其他聚合函数

fig = px.histogram(
    tips,
    x="tip",  # 进行分块
    y="total_bill"
    histfunc='avg')  # 均值

fig.show()

4.8 可视化直方图分布

在绘制了基础直方图之后,我们还可以在整个画布的边际绘制相关图形,辅助显示图形的分布规律,使用的参数是marginal(边际),通过其他图形来展示数据的规律:

fig = px.histogram(
    tips, 
    x="tip"
    color="sex",  # 颜色分组
    marginal="rug"# 可供选择:`rug`、`box`, `violin`
    hover_data=tips.columns
)

fig.show()

五、基于go.Histogram实现

5.1 基础图形

x = tips["total_bill"].tolist()

# 等价于 px.histogram(tips, x="total_bill")
# 直接传入x的值
fig = go.Figure(data=[go.Histogram(x=x)])  

fig.show()

5.2 图形标准化

图形标准化的方式和使用plotly_express是相同的:

import plotly.graph_objects as go
import numpy as np

x = np.random.randn(1000)
fig = go.Figure(data=[go.Histogram(
    x=x, 
    histnorm='probability density'  # 标准化方式选择 'percent', 'probability', 'density', 'probability density'
)])

fig.show()

5.3 水平直方图

将传入的数据作为y轴的值即可绘制水平直方图:

import plotly.graph_objects as go
import numpy as np

y = np.random.randn(1000)  # 生成1000个正态分布的随机数

fig = go.Figure(data=[go.Histogram(
    y=y,  # 变成y的取值 
    histnorm='probability density'  # 标准化方式选择 'percent', 'probability', 'density', 'probability density'
)])

fig.show()

5.4 多个直方图的覆盖模式overlay

import plotly.graph_objects as go

import numpy as np

x0 = np.random.randn(300)
x1 = np.random.randn(300) + 1.5
x2 = np.random.randn(300) - 1.5


fig = go.Figure()
fig.add_trace(go.Histogram(x=x0))
fig.add_trace(go.Histogram(x=x1))
fig.add_trace(go.Histogram(x=x2))

# 设置覆盖模式
fig.update_layout(barmode='overlay')  # 重要参数
# 设置透明度
fig.update_traces(opacity=0.8)
fig.show()

5.5 多个直方图的堆叠模式stack

import plotly.graph_objects as go
import numpy as np

# 随机生成3组数据
x0 = np.random.randn(300)
x1 = np.random.randn(300) + 1
x2 = np.random.randn(300) + 1.5


fig = go.Figure()
fig.add_trace(go.Histogram(x=x0))
fig.add_trace(go.Histogram(x=x1))
fig.add_trace(go.Histogram(x=x2))

# 设置堆叠模式
fig.update_layout(barmode='stack')
# 设置透明度
fig.update_traces(opacity=0.8)
fig.show()

5.6 指定聚合函数

针对同样的数据,可以在不同的轨迹中指定不同的聚合函数,下面的例子中:一个轨迹中指定为统计个数count,另一个轨迹中指定为求和sum

import plotly.graph_objects as go

x = ["小明","小红","小红","小苏""小明""小苏"]
y = ["85","100","132","110","95","120"]

fig = go.Figure()
fig.add_trace(go.Histogram(histfunc="count",   # 指定统计个数的聚合函数
                           y=y, x=x, name="统计个数"))
fig.add_trace(go.Histogram(histfunc="sum",   # 指定求和函数
                           y=y, x=x, name="求和"))

fig.show()
image-20210617114011068

5.7 累计直方图Cumulative Histogram

通过参数cumulative_enabled开启累计功能:默认表示的是个数上的累加。例子总共是100个数,可以看到最终累加的结果刚好是100。

x = list(range(101))

fig = go.Figure(data=[go.Histogram(
    x=x,  # x轴数据
    cumulative_enabled=True
)])  # 开启累计功能

fig.show()

5.8 个性化设置直方图

在下面的例子中绘制了两个直方图,使用的数据如下图中的x0和x1:

fig = go.Figure()

# 直方图1
fig.add_trace(go.Histogram(
    x=x0,  # x轴数据
    histnorm='percent',  # 标准化方式
    name='直方图1',  
    xbins=dict( # x轴起始值和块的大小size
        start=-4.0,  
        end=3.0,
        size=0.5
    ),
    marker_color='#0B89B5',  # 标记颜色
    opacity=0.75  # 透明度
))

# 直方图2
fig.add_trace(go.Histogram(
    x=x1,
    histnorm='percent',
    name='直方图2',
    xbins=dict(
        start=-3.0,
        end=4,
        size=0.5
    ),
    marker_color='#830A73',
    opacity=0.75
))

fig.update_layout(
    title=dict(text='<b>个性化</b>设置直方图'# 标题名称位置;标题中使用HTML标签
               x=0.5,
               y=0.97
              ), 
    xaxis_title=dict(text='取值'), # xy轴label设置
    yaxis_title_text='count'# 默认聚合函数count
    bargap=0.5# 组间距离
    bargroupgap=0.3 # 组内距离
)

fig.show()




推荐阅读


可视化神器Plotly玩转小提琴图

可视化神器Plotly玩转面积图

可视化神器Plotly玩转箱型图

可视化神器Plotly玩转甘特图

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存