移除标签和刻度后,如何回收子图间的水平空白空间?
解决QQ图之间水平空白的方案
方法1:用gridspec精细控制子图布局
因为第一个子图是直方图(需要独立y轴),后续QQ图无需y轴元素,可通过GridSpec分配宽度比例并缩小QQ图间的间距:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import statsmodels.api as sm import numpy as np # 生成示例数据 data = np.random.normal(0, 1, 1000) fig = plt.figure(figsize=(10, 4)) # 定义1行4列网格,给直方图分配更宽比例 gs = GridSpec(1, 4, width_ratios=[1, 0.8, 0.8, 0.8]) # 绘制直方图 ax_hist = fig.add_subplot(gs[0]) ax_hist.hist(data, bins=20) # 绘制QQ图并处理y轴 for i in range(1, 4): ax = fig.add_subplot(gs[i], sharey=ax_hist) sm.qqplot(data, ax=ax, line='s') ax.set_ylabel(None) ax.tick_params(labelleft=False) ax.spines['left'].set_visible(False) # 隐藏y轴轴线,消除残留空白 # 调整QQ图之间的水平间距 gs.update(wspace=0.1) # 数值越小间距越窄,按需调整 plt.show()
方法2:调整subplots的wspace参数
如果是用plt.subplots创建的子图,直接修改水平间距参数,同时隐藏y轴轴线:
import matplotlib.pyplot as plt import statsmodels.api as sm import numpy as np data = np.random.normal(0, 1, 1000) n_qq = 3 # QQ图数量 fig, axqq = plt.subplots(1, 1 + n_qq, figsize=(10, 4)) # 绘制直方图 axqq[0].hist(data, bins=20) # 处理QQ图的y轴元素 for ax in axqq[1:]: sm.qqplot(data, ax=ax, line='s') ax.set_ylabel(None) ax.tick_params(labelleft=False) ax.spines['left'].set_visible(False) # 移除y轴轴线,减少留白 ax.sharey(axqq[0]) # 缩小所有子图的水平间距 plt.subplots_adjust(wspace=0.05) plt.tight_layout() plt.show()
关键提示
- 仅移除y轴标签和刻度还不够,隐藏y轴的**轴线(spine)**才是消除残留空白的核心
wspace参数控制子图水平间距,数值越小间距越窄,可根据图表尺寸灵活调整- 用
GridSpec的width_ratios能给直方图分配更合理的宽度,避免QQ图过度压缩
内容的提问来源于stack exchange,提问作者sds
相关产品推荐
相关产品推荐

