柱状图

Python
可视化
作者

yangjh

发布日期

November 27, 2022

柱状图(bar plot)是用一定宽度和高度的矩形表示各类别频数多少的图形,主要用于展示类别变量的频数分布。

柱状图构成

适合数据类型

一个分类数据字段、一个连续数据字段

分类

  • 柱状图
  • 条形图
  • 聚合柱状图
  • 堆叠柱状图

如果矩形为垂直方向,则称为柱状图,若为水平方向,则成为条形图。

分组柱状图,又叫聚合柱状图。当使用者需要在同一个轴上显示各个分类下不同的分组时,需要用到分组柱状图。

与并排显示分类的分组柱状图不同,堆叠柱状图将每个柱子进行分割以显示相同类型下各个数据的大小情况。它可以形象得展示一个大分类包含的每个小分类的数据,以及各个小分类的占比,显示的是单个项目与整体之间的关系。

使用plotly.express绘制柱状图

导入包后,使用bar方法即可绘制柱状图,bar方法的参数详见:https://plotly.com/python-api-reference/generated/plotly.express.bar

import plotly.express as px 

基础柱状图

绘制基础柱状图时,只需要指定坐标轴对应的数据即可。

import plotly_express as px
import pandas as pd

df1 = pd.DataFrame({
    "name": ["小明","小红","周明","周红","张三"],
    "age": [20,28,18,25,36],
    "score": ["150","170","160","168","154"]
})
fig = px.bar(df1,x="name",y="age")
fig.show()

可以使用color参数,对指定的变量使用颜色进行区分。不建议使用过多颜色对类别进行区分,会造成用户较重的认知负担。

注意上面的演示数据,已经按照类别计算好了总和这些必要数值。如果是原始数据,比如打开一个二维表后,要绘制某个变量的柱状图,则需要先准备好数据,才可以绘图。

准备单个变量柱状图的绘图数据,可以使用DataFrame中的value_counts().reset_index()两个方法,将类别变量计数后,转化为包含变量和技术的DataFrame。

from pyreadstat import pyreadstat
import pandas as pd
import plotly_express as px
调查数据, metadata = pyreadstat.read_sav(
    R'../../data/sav/identity.sav', apply_value_formats=True, formats_as_ordered_category=True)
df_political = 调查数据['政治面貌'].value_counts().reset_index()
fig = px.bar(df_political, x='政治面貌', y='count', 
             labels={'count': '人数'})

# 显示图表
fig.show('svg')

还可以为不同类别增加颜色,使用颜色区分不同类别。颜色变量可以为类别变量,也可以为数值连续变量。

fig = px.bar(df1,
             x="name",
             y="age",
             color="name"   # 颜色参数
            )
fig.show()

水平柱状图

orientation的默认值为"v",若要绘制水平柱状图(也叫条形图),则设定其值为"h"即可。

df = px.data.tips()
fig = px.bar(df, x="total_bill", y="day", orientation='h')
fig.show()

堆叠柱状图

color参数的值如果是类别变量,则会以类别变量为依据进行分组,并使用不同颜色加以区分。plotly.express中默认的分组柱状图为堆叠柱状图。

df2 = pd.DataFrame({
    "姓名": ["小明","小红","张三","小明","小红","张三","小明","小红","张三"],
    "科目":["语文","语文","语文","数学","数学","数学","英语","英语","英语"],
    "得分": [58,78,84,90,71,90,64,84,69]
})
fig = px.bar(df2,
            x="姓名",
            y="得分",
            color="科目")
fig.show()

还可以通过在Y轴上添加多组变量的方式,绘制柱状图。

df3 = pd.DataFrame({
    "姓名": ["小明","小红","张三"],
    "语文":[58,78,84],
    "数学":[90,71,90],
    "英语":[64,84,69]
})
fig = px.bar(df3,
            x="姓名",
            y=["语文","数学","英语"],
            title="学生成绩对比"  
            )
fig.show()

分组柱状图

还可以通过barmode参数,指定分组的模式,默认值为relative(堆叠柱状图)。当barmodegroup时,为分组的数据在x轴并排显示,即分组柱状图。

fig = px.bar(df2,
            x="姓名",
            y="得分",
            color="科目",
            barmode='group')
fig.show()

参考文献

  1. 柱状图 - AntV (alipay.com)
  2. 堆叠柱状图 - AntV (alipay.com)
  3. 分组柱状图 - AntV (alipay.com)
回到顶部