一些绘图函数如 relplot() 返回的不是一个 Axes,而是一个 FacetGrid,无法使用 Axes 的方法来调整,需要用到 FacetGrid 的调整方式
FacetGrid 的结构
g = sns.relplot(...) # 返回一个 FacetGrid 对象赋给 g有如下属性:
g.fig:Figure 对象(整张画布)
g.axes:Axes 数组,二维 ndarray,shape = (n_row, n_col)
若仅使用 col、无 row则shape = (1, n_col)
若使用 col_wrap,则 g.axes 为扁平的一维 ndarray,需通过 g.axes.flat[索引] 或 list(g.axes.flat)[索引] 访问子图
g.legend:Legend 对象(若存在)
FacetGrid 常用调整方法
1. 设置轴标签 g.set_axis_labels
g.set_axis_labels('x轴标签名', 'y轴标签名')同时作用于所有子图
2. 设置子图标题 g.set_titles
g.set_titles('{row_name} | {col_name}')其中 {row_name} 与 {col_name} 为占位符,分别为 row 与 col 指定的特征在当前子图对应的取值,字符串其余内容可以任意修改
3. 设置总标题 g.fig.suptitle
g.fig.suptitle('总标题', y=1.02)设置 y=1.02 避免与子图标题重叠
4. 图例 g.legend
g.legend.set_title('图例标题') # 设置图例的标题 g.legend.set_bbox_to_anchor((1.02, 0.5)) # 对齐坐标,右侧中部 g.legend.loc = 'center left' # 图例左边框中部用于与对齐坐标对齐配合 g.tight_layout 使用
5. 布局收紧 g.tight_layout
g.tight_layout()通常不需要 rect 参数,若图例外置后仍被裁剪,可改用 plt.tight_layout(rect=...)
6. 访问单个子图 g.axes[行, 列]
ax = g.axes[行, 列]将 [行, 列] 索引的子图赋给 ax,之后可按 ax 的方法单独对该子图进行调整
例如:
有使用col_wrap 时访问第一个子图
ax = g.axes.flat[0]