如何在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
相关产品推荐
相关产品推荐

