【问题标题】:How do you force python subplots to have equal widths and separate heights (gridspec isn't working)?你如何强制 python 子图具有相同的宽度和不同的高度(gridspec 不起作用)?
【发布时间】:2015-06-02 18:23:53
【问题描述】:

我有下图。要求每个轴的纵横比相等。我喜欢子图之间匹配的宽度和由子图的纵横比定义的高度。

我尝试使用 GridSpec- 完全混乱- 不可能缩小空白以制作合理的情节,所以我一定做错了什么:

left  = 0.125  
right = 0.9    
bottom = 0.2   
top = 0.9      
wspace = 0.1  
hspace = 0.1   

fig = plt.figure(5, figsize=(4, 12))
gs = gridspec.GridSpec(5, 1,
                   width_ratios=[1,1,1,1,1],
                   height_ratios=[0.5,1.2,1,1.5,3])
plt.subplots_adjust(left=left,right=right,wspace=wspace,bottom=bottom,top=top,hspace=hspace)

ax1 = plt.subplot(gs[0],aspect='equal',xlim=[0,2],ylim=[0,0.5])
plt.plot(z,z,color='black',zorder=1)                                              
ax1.grid(which='major', alpha=0.5)
sc = plt.scatter(bob1[:-1,4],bob1[:-1,2],cmap=cmap,c=z,s=45,zorder=2)

ax2 = plt.subplot(gs[1],aspect='equal',xlim=[0,1.5],ylim=[0,0.8])
plt.plot(z,z,color='black',zorder=1)                                              
ax2.grid(which='major', alpha=0.5)
major_ticks = np.arange(0, 1.4, 0.4)                                               
ax2.set_xticks(major_ticks)
ax2.set_yticks(major_ticks)
sc = plt.scatter(bob2[:-1,4],bob2[:-1,2],cmap=cmap,c=z,s=45,zorder=2)

ax3 = plt.subplot(gs[2],aspect='equal',xlim=[0,2],ylim=[0,1])
plt.plot(z,z,color='black',zorder=1)                                               
ax3.grid(which='major', alpha=0.5)
sc = plt.scatter(bob3[:-1,4],bob3[:-1,2],cmap=cmap,c=z,s=45,zorder=2)

ax4 = plt.subplot(gs[3],aspect='equal',xlim=[0,2],ylim=[0,1.5],zorder=2)
plt.plot(z,z,color='black',zorder=1)                                              
ax4.grid(which='major', alpha=0.5)
sc = plt.scatter(bob4[:-1,4],bob4[:-1,2],cmap=cmap,c=z,s=45,zorder=2)

ax5 = plt.subplot(gs[4],aspect='equal',xlim=[0,3],ylim=[0,3])
plt.plot(z,z,color='black',zorder=1)                                             
ax5.grid(which='major', alpha=0.5)
major_ticks = np.arange(0, 3, 1.0)                                               
ax5.set_xticks(major_ticks)
ax5.set_yticks(major_ticks)
sc = plt.scatter(bob5[:-1,4],bob5[:-1,2],cmap=cmap,c=z,s=45,zorder=2)

cbar_ax = fig.add_axes([0.8, 0.3, 0.03, 0.4])
cbar = fig.colorbar(sc, cax=cbar_ax)
cbar.set_ticks([0,6.45,13])
cbar.set_ticklabels([14,7,0])

【问题讨论】:

标签: python matplotlib plot


【解决方案1】:

当我想要不同高度的子图(通常在我的情况下)共享 x 轴时,我会这样做:

fig,ax = plt.subplots(nrows=2, sharex=True, gridspec_kw=dict(height_ratios=[1,3]))

plt.subplots_adjust(hspace=0.02) # 等

【讨论】:

  • 感谢您的帮助@user2223275!听起来很合理,但是当我运行代码时,我收到错误消息:__init__() 得到了一个意外的关键字参数“gridspec_kw”。我使用的是 python 2.7,我将 matplotlib 导入为 plt。这应该涵盖它,对吧?
  • 嗨。我也用2.7。这是一个适合我的完整脚本。
  • import matplotlib.pyplot as plt fig,ax = plt.subplots(nrows=3, ncols=1, sharex=True, figsize=(8,11), gridspec_kw=dict(height_ratios=[1 ,1,3])) plt.subplots_adjust(hspace=0.02, top=0.94, right=0.95, bottom=0.06) ax[0].plot([1,2,3], [4,3,1], 'o-') ax[1].plot([1,2,3], [1,6,2], 'o-') ax[2].plot([1,2,3], [5 ,3,8], 'o-')
  • 抱歉格式化。我正在使用 matplotlib 2.7.8。
  • 确保您调用的是 plt.subplots(复数形式为 's')而不是 plt.subplot。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 2017-03-31
  • 2020-06-30
  • 2013-10-25
相关资源
最近更新 更多