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

如何在Upset Plot中显示各交集对应的电影名称?

在UpsetPlot交集位置显示电影名称列表

实现步骤

要在UpsetPlot的每个交集条形处显示对应的电影名称列表,需先按类型组合分组收集对应电影,再通过matplotlib的文本标注功能将列表添加到图中。

示例代码

import pandas as pd
import upsetplot
from matplotlib import pyplot as plt

# 1. 构造模拟电影数据(替换为你的真实数据)
data = {
    'Movie': [f'Movie_{i}' for i in range(100)],
    'Action': [i % 2 == 0 for i in range(100)],
    'Comedy': [i % 3 == 0 for i in range(100)],
    'Drama': [i % 4 == 0 for i in range(100)]
}
df = pd.DataFrame(data)

# 2. 按类型组合分组,收集对应电影列表
genre_cols = ['Action', 'Comedy', 'Drama']
df['genre_combination'] = df[genre_cols].apply(
    lambda row: tuple(col for col in genre_cols if row[col]),
    axis=1
)
movie_groups = df.groupby('genre_combination')['Movie'].apply(list).to_dict()

# 3. 绘制Upset图并添加电影列表标注
plot_obj = upsetplot.plot(df[genre_cols], show_counts=True)
bars = plot_obj['bars']

for bar in bars.patches:
    # 获取当前条形对应的类型组合
    combo = eval(bar.get_label())
    movies = movie_groups.get(combo, [])
    
    # 处理显示文本(避免过长重叠,显示前5个+省略号)
    display_text = '\n'.join(movies[:5]) + ('\n...' if len(movies) > 5 else '')
    
    # 设置标注位置(条形上方居中)
    x_pos = bar.get_x() + bar.get_width() / 2
    y_pos = bar.get_height()
    
    plt.text(x_pos, y_pos, display_text, ha='center', va='bottom', fontsize=8)

plt.tight_layout()
plt.show()

注意事项

  • 若电影数量过多,直接显示全部名称会导致文本重叠,建议限制显示条数(如示例中取前5个),或缩小字体大小。
  • 如需交互式查看完整列表,可结合plotly等库实现悬停tooltip功能,但需要额外代码改造。
  • 确保数据中存在Movie列,且类型列(如Action、Comedy)为布尔值或可转换为布尔值的格式。

内容的提问来源于stack exchange,提问作者Uqhah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:23:09