使用for循环绘制(1,10)布局子图:多区域营收趋势图问题
实现1行10列紧凑子图的区域营收趋势折线图对比
问题背景
需要以日期为X轴绘制10个区域的营收趋势折线图,要求展示在(1,10)布局的紧凑子图中方便对比,但当前代码生成的是10个独立图表,对比难度大。数据结构为date | region | revenue,现有代码如下:
region =['a','b','c'...] for i in region: df = df[df['region']==i] plt.figure(figsize=(6, 4)) ax= sns.lineplot(x="date", y="revenue", data=df) ax.set_title("region : {}".format(i)) plt.show()
解决方案
核心思路是提前创建1行10列的子图容器,再在循环中为每个子图分配对应区域的数据绘制折线,同时调整布局保证紧凑性:
import matplotlib.pyplot as plt import seaborn as sns # 先复制原始数据,避免循环中覆盖原数据集 original_df = df.copy() region = ['a','b','c','d','e','f','g','h','i','j'] # 创建1行10列的子图,设置足够宽的画布适配10个子图 fig, axes = plt.subplots(1, 10, figsize=(30, 4)) # 循环遍历每个区域和对应的子图位置 for idx, reg in enumerate(region): # 筛选当前区域的数据 sub_df = original_df[original_df['region'] == reg] # 在对应子图上绘制折线图 sns.lineplot(x="date", y="revenue", data=sub_df, ax=axes[idx]) # 设置子图标题 axes[idx].set_title(f"region: {reg}") # 旋转X轴日期标签,避免文字重叠 axes[idx].tick_params(axis='x', rotation=45) # 自动调整子图间距、标签位置,保证布局紧凑 plt.tight_layout() plt.show()
关键说明
- 不要在循环中重复创建
plt.figure(),而是用plt.subplots()一次性生成所有子图的容器axes - 画布
figsize需设置足够宽,防止10个子图过度挤压 - 用
enumerate获取区域的索引,对应到axes数组的具体子图位置 tight_layout()会自动优化子图间距,避免标题、标签重叠- 如果日期标签仍然拥挤,可以进一步调大旋转角度或缩小字体(比如
axes[idx].tick_params(axis='x', labelsize=8))
内容的提问来源于stack exchange,提问作者Chelsy
相关产品推荐
相关产品推荐

