You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多值特征创建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结构:

索引RatingGenres
06['action', 'drama', 'comedy']
18['comedy', 'drama']
23['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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.06 16:15:43