Python 3.6中Gridspec子图Y轴压缩问题求助
嘿,我看你遇到了Gridspec子图Y轴被压缩的问题,这在布局多个子图时真的挺常见的,我来给你几个实用的解决办法!
核心问题本质是:当用Gridspec排列子图时,要么整体画布高度不够,要么子图的高度分配不合理,导致Y轴空间被挤占。下面是几个针对性的方案:
1. 先调整整体画布尺寸(最直接的办法)
在创建Figure的时候,把figsize的高度参数调大,给Y轴预留足够的展示空间。比如原来用plt.figure(figsize=(12, 6)),可以改成plt.figure(figsize=(12, 10)),高度翻倍后子图Y轴的空间会宽松很多。
示例代码:
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # 增大画布高度,给Y轴留足空间 fig = plt.figure(figsize=(12, 10)) gs = gridspec.GridSpec(3, 2) # 假设你是3行2列的布局 # 然后添加子图并绘图 ax1 = fig.add_subplot(gs[0, 0]) # 调用你的graphiqueLigneDate函数传入ax1
2. 用Gridspec的height_ratios自定义子图高度比例
如果某些子图需要更多Y轴空间,可以通过height_ratios参数给不同行设置差异化高度。比如让第一行子图高度是其他行的2倍:
# 3行2列布局,第一行高度是后两行的2倍 gs = gridspec.GridSpec(3, 2, height_ratios=[2, 1, 1])
这样重点子图的Y轴就不会被挤得太窄了。
3. 调整子图间的垂直间距(hspace)
有时候子图之间的垂直间距过大,也会挤占单个子图的高度。可以用gridspec.update()来缩小垂直间距:
gs.update(hspace=0.3) # 数值越小,垂直间距越小,子图高度占比越大
注意别调得太小,不然子图的标题、Y轴标签可能会互相重叠。
4. 手动控制画布边距(避开tight_layout的自动压缩)
如果你用了plt.tight_layout(),它会自动调整子图间距,但有时候会过度压缩Y轴。可以试试用subplots_adjust手动控制上下边距:
plt.subplots_adjust(bottom=0.1, top=0.9, hspace=0.3)
通过bottom和top参数,你可以直接控制画布上下留白的比例,让子图有足够的高度展示Y轴。
结合你的代码补充优化
看你提供的graphiqueLigneDate函数是接收axe参数绘图,那要确保创建这个axe时,它所在的Gridspec已经分配了足够高度。我给你写个完整的示例:
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec # 模拟你的数据 listeDates = ["2023-01-01 00:00", "2023-01-02 00:00", "2023-01-03 00:00", "2023-01-04 00:00", "2023-01-05 00:00", "2023-01-06 00:00"] listeOrdonnees = [10, 20, 15, 25, 30, 22] nomOrdonnees = "Valeurs" labelLigne = "Ligne 1" def graphiqueLigneDate(listeDates, listeOrdonnees, nomOrdonnees, axe, labelLigne): listeTicks = [] step = 2 for i in range(int(len(listeDates)/step)+1): if step*i < len(listeDates): # 防止索引越界 listeTicks.append(listeDates[step*i][:-5]) axe.plot(listeDates, listeOrdonnees, label=labelLigne) axe.set_ylabel(nomOrdonnees) axe.set_xticks(listeDates[::step]) axe.set_xticklabels(listeTicks) axe.legend() # 创建画布和Gridspec,设置合适的高度比例和画布尺寸 fig = plt.figure(figsize=(12, 8)) gs = gridspec.GridSpec(2, 2, height_ratios=[1.5, 1]) gs.update(hspace=0.4) # 添加子图并调用你的函数绘图 ax1 = fig.add_subplot(gs[0, 0]) graphiqueLigneDate(listeDates, listeOrdonnees, nomOrdonnees, ax1, labelLigne) ax2 = fig.add_subplot(gs[0, 1]) graphiqueLigneDate(listeDates, [i*1.2 for i in listeOrdonnees], nomOrdonnees, ax2, "Ligne 2") plt.show()
这个示例里,我增大了画布高度、设置了行高度比例、调整了垂直间距,子图的Y轴就不会被压缩了。
内容的提问来源于stack exchange,提问作者TmSmth

