Python数据可视化的例子——小提琴图(violin)

2023-03-27 08:09:15

小提琴图是比较有意思的统计图形,它将数值型数据的核密度图与箱线图融合在一起,进而得到一个形似小提琴的图形。尽管matplotlib模块也提供了绘制小提琴图的函数violinplot,但是绘制出来的图形中并不包含一个完整的箱线图,所以本节将直接使用seaborn模块中的violinplot函数绘制小提琴图。首先,带领读者了解一下有关violinplot函数的语法和参数含义:

sns.violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
        bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100,
        width=0.8, inner='box', split=False, dodge=True, orient=None,
        linewidth=None, color=None, palette=None, saturation=0.75, ax=None)
  • x:指定小提琴图的x轴数据。
  • y:指定小提琴图的y轴数据。
  • hue:指定一个分组变量。
  • data:指定绘制小提琴图的数据集。
  • order:传递一个字符串列表,用于分类变量的排序。
  • hue_order:传递一个字符串列表,用于分类变量hue值的排序。
  • bw:指定核密度估计的带宽,带宽越大,密度曲线越光滑。
  • scale:用于调整小提琴图左右的宽度,如果为area,则表示每个小提琴图左右部分拥有相同的面积;如果为count,则表示根据样本数量来调节宽度;如果为width,则表示每个小提琴图左右两部分拥有相同的宽度。
  • scale_hue:bool类型参数,当使用hue参数时,是否对hue变量的每个水平做标准化处理,默认为True。
  • width:使用hue参数时,用于控制小提琴图的宽度。
  • inner:指定小提琴图内部数据点的形态,如果为box,则表示绘制微型的箱线图;如果为quartiles,则表示绘制四分位的分布图;如果为point或stick,则表示绘制点或小竖条。
  • split:bool类型参数,使用hue参数时,将小提琴图从中间分为两个不同的部分,默认为False。
  • dodge:bool类型的参数,当使用hue参数时,是否绘制水平交错的小提琴图,默认为True。
  • orient:指定小提琴图的呈现方向,默认为垂直方向。
  • linewidth:指定小提琴图的所有线条宽度。
  • color:指定小提琴图的颜色,该参数与palette参数一起使用时无效。
  • palette:指定hue变量的区分色。
  • saturation:指定颜色的透明度。
  • ax:指定子图的位置。
    接下来,以酒吧的消费数据为例(数据包含客户的消费金额、消费时间、打赏金额、客户性别、是否抽烟等字段):
    在这里插入图片描述
    利用如上介绍的函数绘制分组小提琴图,以帮助读者进一步了解参数的含义,绘图代码如下:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读取数据
tips = pd.read_excel(r'酒吧消费数据.xlsx')
# 绘制分组小提琴图
sns.violinplot(x = "day", # 指定x轴的数据
               y = "total_bill", # 指定y轴的数据
               hue = "sex", # 指定分组变量
               data = tips, # 指定绘图的数据集
               order = ['Thur','Fri','Sat','Sun'], # 指定x轴刻度标签的顺序
               scale = 'count', # 以男女客户数调节小提琴图左右的宽度
               split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线;
               palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量)
              )
# 添加图形标题
plt.title('每天不同性别客户的酒吧消费额情况')
# 设置图例
plt.legend(loc = 'upper left', ncol = 2)
# 显示图形
plt.show()

matplotlib命令与格式:图例legend语法及设置
在这里插入图片描述

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#设置绘图风格
plt.style.use('ggplot')
#处理中文乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#坐标轴负号的处理
plt.rcParams['axes.unicode_minus']=False
# 读取数据
tips = pd.read_excel(r'酒吧消费数据.xlsx')
# 绘制分组小提琴图
sns.violinplot(x = "day", # 指定x轴的数据
               y = "total_bill", # 指定y轴的数据
               hue = "sex", # 指定分组变量
               data = tips, # 指定绘图的数据集
               order = ['Thur','Fri','Sat','Sun'], # 指定x轴刻度标签的顺序
               scale = 'count', # 以男女客户数调节小提琴图左右的宽度
               split = True, # 将小提琴图从中间割裂开,形成不同的密度曲线;
               palette = 'RdBu' # 指定不同性别对应的颜色(因为hue参数为设置为性别变量)
              )
# 添加图形标题
plt.title('每天不同性别客户的酒吧消费额情况')
# 设置图例
plt.legend(loc = 'upper right', ncol = 2)
#控制横纵坐标的值域
plt.axis([-1,4,-10,70])
# 显示图形
plt.show()

在这里插入图片描述

如图所示,得到了分组的小提琴图,我们会发现,小提琴图的左右两边并不对称,是因为同时使用了hue参数和split参数,两边的核密度图代表了不同性别客户的消费额分布。从这张图中,一共可以反映四个维度的信息,y轴表示客户的消费额、x轴表示客户的消费时间、颜色图例表示客户的性别、左右核密度图的宽度代表了样本量。以周五和周六两天为例,周五的男女客户数量差异不大,而周六男性客户要比女性客户多得多,那是因为右半边的核密度图更宽一些。

  • 作者:Fo*(Bi)
  • 原文链接:https://blog.csdn.net/weixin_48615832/article/details/108452781
    更新时间:2023-03-27 08:09:15