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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:20:08