如何在Python中每行并排展示含子图的两类情感词频图表
问题描述
我希望为每个类别绘制包含正负词的组合图表,目前使用plt.subplot()循环生成每个类别的独立图表。现在需要实现:保持每个类别正负词组合为独立单元的前提下,每行并排显示两个这样的单元。
我尝试过两段代码:
- 第一段代码会为每个类别单独生成一个包含正负词的图表,但每个图表单独一行显示;
- 第二段代码将所有图表合并到同一个大图中,破坏了“每个类别图表独立”的需求。
解决方案
核心思路是按批次处理类别,每批次取2个类别,为这一批次创建一个包含对应子图的画布,绘制完成后显示该画布,再处理下一批次。这样既保留了每个类别正负词组合的独立性,又实现了每行并排两个单元的效果。
示例代码
import matplotlib.pyplot as plt import seaborn as sns # 获取所有类别 categories = results_df['Category'].unique() # 每批次处理2个类别,控制每行显示数量 batch_size = 2 # 按批次遍历类别 for batch_start in range(0, len(categories), batch_size): # 获取当前批次的类别列表 current_batch = categories[batch_start:batch_start + batch_size] # 创建画布:行数为批次内类别数,列数固定为2(正负词各一列) fig, axs = plt.subplots(len(current_batch), 2, figsize=(12, 4 * len(current_batch))) # 处理单类别批次的情况,避免axs维度问题 if len(current_batch) == 1: axs = axs.reshape(1, 2) # 遍历批次内的每个类别,绘制正负词图表 for row_num, category in enumerate(current_batch): # 绘制正词条形图 pos_subset = results_df[(results_df['Category'] == category) & (results_df['Sentiment'] == 'Positive')] pos_subset = pos_subset.sort_values(by='Frequency', ascending=False) ax_pos = axs[row_num, 0] sns.barplot(x='Frequency', y='Word', data=pos_subset, color=sns.color_palette('muted')[2], ax=ax_pos) ax_pos.set(ylabel='', xlabel='') ax_pos.set_title(f'{category} - 高频正词') # 绘制负词条形图 neg_subset = results_df[(results_df['Category'] == category) & (results_df['Sentiment'] == 'Negative')] neg_subset = neg_subset.sort_values(by='Frequency', ascending=False) ax_neg = axs[row_num, 1] sns.barplot(x='Frequency', y='Word', data=neg_subset, color=sns.color_palette('muted')[0], ax=ax_neg) ax_neg.set(ylabel='', xlabel='') ax_neg.set_title(f'{category} - 高频负词') # 调整布局,避免元素重叠 plt.subplots_adjust(wspace=0.4, hspace=0.5, top=0.9) plt.suptitle('各分类高频情感词统计', fontsize=14) plt.tight_layout() # 显示当前批次的画布 plt.show()
代码说明
- 按
batch_size=2分组,每次处理两个类别,生成对应画布,每行显示两个类别单元 - 每个类别在画布中占据一行,左右分别为正负词图表,保留了原有的组合独立性
- 自动适配最后一批次类别数不足2的情况,避免索引错误
- 通过调整
figsize和布局参数,保证图表显示美观
内容的提问来源于stack exchange,提问作者Anna Gromovich
相关产品推荐
相关产品推荐

