如何将Seaborn绘图添加到带子图的Matplotlib Figure并循环生成
解决Seaborn绘图嵌入Matplotlib子图的问题
我来帮你搞定这个问题!Seaborn和Matplotlib的兼容性很好,核心就是通过Seaborn绘图函数的ax参数,指定要绘制的目标坐标轴(也就是你的子图ax[0]、ax[1]、ax[2])。
步骤1:修改你的绘图函数
首先,给plotf函数添加一个ax参数,让它可以接收指定的坐标轴。如果没有传入ax,就默认使用当前活跃的坐标轴,这样也不影响函数原来的单独使用:
import pandas as pd import numpy as np import seaborn as sns from matplotlib import pyplot as plt def plotf(df_x, ax=None): # 如果未指定ax,使用当前坐标轴 if ax is None: ax = plt.gca() # 在指定的ax上绘制Seaborn折线图 g = sns.lineplot(data=df_x[['2016','2017','2018']], ax=ax) g.set_xticks(range(0,12)) g.set_xticklabels(['Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec','Jan']) return g
步骤2:在子图中调用函数
创建好fig和ax数组后,你可以通过循环或者逐个调用的方式,把每个子图的ax对象传给plotf函数,这样就能把Seaborn图画到对应的子图里了:
# 生成示例数据 df = pd.DataFrame({ 'Period': list(range(1,13)), '2016': np.random.randint(low=1, high=100, size=12), '2017': np.random.randint(low=1, high=100, size=12), '2018': np.random.randint(low=1, high=100, size=12) }) # 创建3行1列的子图布局 fig, ax = plt.subplots(nrows=3, figsize=(8, 10)) # 指定figsize让布局更美观 # 循环给每个子图绘图 for idx in range(3): # 这里可以根据需求传入不同的df,比如df的子集,示例用同一个df plotf(df, ax=ax[idx]) # 调整子图间距,避免标签重叠 plt.tight_layout() # 显示图形 plt.show()
原理说明
Seaborn的绝大多数绘图函数(比如sns.lineplot、sns.barplot等)都支持ax参数,这个参数接受一个Matplotlib的Axes对象。通过指定这个参数,你就能精准控制Seaborn图绘制在哪个子图上,完美整合到Matplotlib的多子图布局中。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

