如何为多值特征创建seaborn violinplot小提琴图
多值类型特征下的电影评分小提琴图绘制方案
问题描述
在做电影数据集可视化分析时,需要绘制电影类型对应评分分布的小提琴图,用到的两个核心特征为电影评分、电影类型。
当前数据中多数电影同时归属多个类型,类型字段存储为列表格式,暂未做编码处理,初始构造数据代码如下:
genres = [['action', 'drama', 'comedy'], ['comedy', 'drama'], ['action', 'sci-fi', 'comedy']] rating = [6, 8, 3] data = {'Rating': rating, 'Genres': genres} df = pd.DataFrame(data=data)
初始DataFrame结构:
| 索引 | Rating | Genres |
|---|---|---|
| 0 | 6 | ['action', 'drama', 'comedy'] |
| 1 | 8 | ['comedy', 'drama'] |
| 2 | 3 | ['action', 'sci-fi', 'comedy'] |
单类型场景下可直接调用以下代码完成绘图:
sns.violinplot(x='Genres', y='Rating', data=df)
单类型绘图效果参考:
多值类型场景下直接调用上述代码会把整个列表作为x轴分类,无法得到按单个类型拆分的分布结果。
解决方法
不需要调整绘图逻辑,只需要先把多值类型的数据集拆分为单行对应单个类型+对应评分的长表结构,再调用原有绘图接口即可。
实现代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 拆分多值类型列,列表中每个元素单独生成一行,评分自动同步复制 df_long = df.explode(column='Genres', ignore_index=True) # 按常规单类型字段逻辑绘图即可 plt.figure(figsize=(10, 6)) sns.violinplot(x='Genres', y='Rating', data=df_long) # 类型数量较多时可旋转x轴标签避免重叠 plt.xticks(rotation=30) plt.show()
补充说明
- 拆分后每个类型对应的评分样本为所有标注了该类型的电影评分,绘制出的小提琴图可以准确反映各类型自身的评分分布
- 如果需要避免同一部电影在跨类型统计时的重复权重影响,可以根据分析目标增加加权、去重规则,常规分布统计场景下直接拆分即可满足需求
- 若使用的pandas版本低于0.25.0没有
explode方法,可以用列表推导式手动实现拆分:# 旧版pandas手动拆分实现 df_long = pd.DataFrame([ {'Rating': row.Rating, 'Genres': g} for _, row in df.iterrows() for g in row.Genres ])
内容的提问来源于stack exchange,提问作者Placeholder
相关产品推荐
相关产品推荐

