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

如何将for循环生成的散点图转为网格布局(以2×3为例)?

如何将多个散点图排列成网格布局?

我编写了一段简单的for循环代码,遍历数据集集合,为每个数据集绘制散点图,代码如下:

for i in dataframes:
    x = i['cycleNumber']
    y = i['QCharge_mA_h']

    plt.figure()
    sns.scatterplot(x=x, y=y).set(title=i.name) 

当前图表会逐个独立显示(堆叠排列),为提升可读性,希望找到简单方法将所有图表排列成网格。以包含6个数据集的示例代码为例,我想将散点图排成2×3的网格,该如何实现?

示例代码如下:

data1 = {'X':[12, 10, 20, 17], 'Y':[9, 8, 5, 3]}  
data2 = {'X':[2, 13, 7, 21], 'Y':[17, 18, 4, 6]}  
data3 = {'X':[9, 19, 20, 3], 'Y':[6, 12, 4, 1]}  
data4 = {'X':[10, 13, 15, 1], 'Y':[6, 12, 5,16]}  
data5 = {'X':[12, 10, 5, 3], 'Y':[18, 7, 21, 7]}  
data6 = {'X':[5, 10, 8, 17], 'Y':[9, 12, 5, 18]}

df1=pd.DataFrame(data1)
df2=pd.DataFrame(data2)
df3=pd.DataFrame(data3)
df4=pd.DataFrame(data4)
df5=pd.DataFrame(data5)
df6=pd.DataFrame(data6)

lst = [df1, df2, df3, df4, df5, df6]

for i in lst:
    plt.figure()
    sns.scatterplot(x=i['X'], y=i['Y'])

解决方案

核心思路是提前创建好2×3的子图网格,把每个散点图绘制到对应的子图上,而不是每次循环都新建独立图表。修改后的代码如下:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 数据集定义部分保持不变
data1 = {'X':[12, 10, 20, 17], 'Y':[9, 8, 5, 3]}  
data2 = {'X':[2, 13, 7, 21], 'Y':[17, 18, 4, 6]}  
data3 = {'X':[9, 19, 20, 3], 'Y':[6, 12, 4, 1]}  
data4 = {'X':[10, 13, 15, 1], 'Y':[6, 12, 5,16]}  
data5 = {'X':[12, 10, 5, 3], 'Y':[18, 7, 21, 7]}  
data6 = {'X':[5, 10, 8, 17], 'Y':[9, 12, 5, 18]}

df1=pd.DataFrame(data1)
df2=pd.DataFrame(data2)
df3=pd.DataFrame(data3)
df4=pd.DataFrame(data4)
df5=pd.DataFrame(data5)
df6=pd.DataFrame(data6)

lst = [df1, df2, df3, df4, df5, df6]

# 创建2行3列的子图网格,figsize可按需调整大小
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(15, 10))

# 将二维子图数组转成一维列表,方便循环遍历
axes_flat = axes.flatten()

# 同时遍历数据集和对应的子图
for idx, (df, ax) in enumerate(zip(lst, axes_flat)):
    # 在指定子图上绘制散点图
    sns.scatterplot(data=df, x='X', y='Y', ax=ax)
    # 设置子图标题,可用数据集的name属性替换(如你的原始代码里的i.name)
    ax.set_title(f"数据集{idx+1}")

# 自动调整子图间距,避免标签重叠
plt.tight_layout()
# 展示图表
plt.show()

关键要点:

  • plt.subplots(nrows=2, ncols=3):一次性生成2行3列的子图布局,返回的axes是二维数组。
  • axes.flatten():把二维数组转成一维,循环时能按顺序获取每个子图。
  • sns.scatterplot()的ax参数:指定当前图要画在哪个子图上,这是实现网格的核心。
  • plt.tight_layout():自动调整子图位置和间距,解决标题、坐标轴标签重叠问题。

如果你的原始数据集带有name属性(比如第一个代码示例里的i.name),直接把标题改成ax.set_title(df.name)即可,更贴合你的实际场景。


内容的提问来源于stack exchange,提问作者Luke Delves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:10:31