如何使用gridspec调整列宽?

时间:2017-05-05 12:05:37

标签: python matplotlib

如何修复此情节?

我想:

  1. 两个颜色条不重叠。
  2. 使他们的身高等于情节。
  3. 这是我的代码:

    combined = (...) # some irrelevant to question data praparation - this variable contain square matrix with RGBA chanels
    
    plt.figure(dpi=300, figsize=(2.1,1.9))
    gs = gridspec.GridSpec(1, 3, width_ratios=[20,1,1])
    ax1 = plt.subplot(gs[0])
    ax2 = plt.subplot(gs[1])
    ax3 = plt.subplot(gs[2])
    
    cax = ax1.imshow(combined, interpolation="None")
    mpl.colorbar.ColorbarBase(ax2, cmap=cmap_top, norm=norm_top)
    mpl.colorbar.ColorbarBase(ax3, cmap=cmap_top, norm=norm_top)
    

    我正在使用python 3.6和matplotlib 2.0。

    broken plot

2 个答案:

答案 0 :(得分:0)

在这种情况下,建议不要使用gridspec。您可以使用make_axes_locatable中的mpl_toolkits.axes_grid1类创建新的颜色条轴。

然后,您需要为分隔符的填充以及图形边距(使用subplots_adjust)找到一些拟合参数。

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import matplotlib.colorbar
import numpy as np; np.random.seed(1)

a = -np.log10(np.random.rand(25,25))

fig, ax = plt.subplots(dpi=300, figsize=(2.1,1.9))
fig.subplots_adjust(left=0.15,right=.78)

cmap=plt.cm.terrain
norm = matplotlib.colors.LogNorm(1e-3, 4)

im = ax.imshow(a, interpolation="None", cmap=cmap, norm=norm)

divider = make_axes_locatable(ax)
cax = divider.new_horizontal(size="5%", pad=0.05)
cax2 = divider.new_horizontal(size="5%", pad=0.45)

fig.add_axes(cax)
fig.add_axes(cax2)

plt.colorbar(im, cax=cax)
plt.colorbar(im, cax=cax2)

plt.show()

enter image description here

制作足够的空间以使色条标签不重叠,在这种情况下几乎是图形宽度的一半,但我想这就是你想要的。

答案 1 :(得分:0)

我会考虑问题1的两种可能性:  一个。修改wspace参数,该参数控制数字之间的水平空间,即:

gs = gridspec.GridSpec(1, 3, width_ratios=[20,1,1])
gs.update(wspace=0.05)

湾在第一个和第二个颜色条之间添加一个额外的列,作为一些空白空间:

gs = gridspec.GridSpec(1, 4, width_ratios=[20,1,0.15,1])

(这里只是一个例子)

对于问题2,我会以不同的方式写出来(因为它对我来说效果很好:

ax2=plt.subplot(gs[0,1]  )
cb1 = matplotlib.colorbar.ColorbarBase(ax2, cmap="RdBu_r")

希望它有所帮助!