求助:使用Pandas与Plotly创建月度分面条形网格图表失败
嘿,这事儿好办!既然你已经搞定了按月的数据聚合,要生成每个月份独立的公司统计条形图,我给你俩实用方案,都是Python里常用的可视化路子:
方案一:用Seaborn的FacetGrid快速实现
Seaborn的FacetGrid专门就是干这种分面可视化的活儿,代码简洁还自带美观样式,适合快速出图:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 假设你的聚合后数据框是agg_data,结构为:month | company | count # 先把月份转成类别型,避免乱序(比如1月跑到12月后面) agg_data['month'] = agg_data['month'].astype('category') # 创建分面网格:按月份列排列,每行最多放3个图表,可根据需求调整col_wrap g = sns.FacetGrid(agg_data, col='month', col_wrap=3, height=4, aspect=0.8) # 映射条形图:x轴是公司,y轴是统计数量 g.map(sns.barplot, 'company', 'count', order=agg_data['company'].unique()) # 统一设置坐标轴标签和子图标题 g.set_axis_labels('公司', '统计数量') g.set_titles('月份: {col_name}') # 自动调整布局,避免标签重叠 plt.tight_layout() plt.show()
方案二:用Matplotlib手动控制子图细节
如果你想更精细地控制每个子图的样式、布局,可以用Matplotlib手动生成子图网格:
import matplotlib.pyplot as plt import pandas as pd # 假设你的聚合后数据框是agg_data # 获取所有唯一月份 months = agg_data['month'].unique() # 计算子图的行列数:每行放3个,行数向上取整 n_cols = 3 n_rows = (len(months) + n_cols - 1) // n_cols # 创建子图网格,设置整体画布大小 fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 5*n_rows)) # 把二维的axes数组转成一维,方便遍历 axes = axes.flatten() # 遍历每个月份和对应的子图 for ax, month in zip(axes, months): # 筛选当前月份的数据 month_data = agg_data[agg_data['month'] == month] # 绘制条形图 ax.bar(month_data['company'], month_data['count']) # 设置子图标题和坐标轴标签 ax.set_title(f'月份: {month}', fontsize=12) ax.set_xlabel('公司', fontsize=10) ax.set_ylabel('统计数量', fontsize=10) # 旋转x轴标签,避免公司名称过长重叠 ax.tick_params(axis='x', rotation=45, labelsize=8) # 如果月份数量不是3的整数倍,隐藏多余的空图 for ax in axes[len(months):]: ax.axis('off') # 自动调整布局 plt.tight_layout() plt.show()
几个关键注意点
- 数据格式要对:确保你的聚合数据是长格式(每行对应一个「月份-公司」的统计项)。如果是宽格式(列是不同公司,行是月份),可以用
pd.melt()转成长期格式:# 示例:宽格式转长格式 long_data = wide_data.melt(id_vars='month', var_name='company', value_name='count') - 月份显示优化:如果月份是数字(比如1-12),可以转成中文/英文月份名称,让图表更直观:
# 转成中文月份名称 agg_data['month'] = pd.to_datetime(agg_data['month'], format='%m').dt.month_name(locale='zh_CN')
内容的提问来源于stack exchange,提问作者ritzrori
相关产品推荐
相关产品推荐

