如何将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
相关产品推荐
相关产品推荐

