【问题标题】:Remove boxes around imshow when sharing X axis共享 X 轴时移除 imshow 周围的框
【发布时间】:2017-08-21 08:00:01
【问题描述】:

当我尝试堆叠多个 imshow 元素时,在垂直轴上它们周围出现了一些额外的空白,并且标题与其他图形过于接近。

我认为这两个问题都是由sharex=True 引起的,但我不知道如何解决。

fig.tight_layout()几乎解决了这个问题,但是它与侧面的颜色条不兼容,并且使某些正方形比其他正方形小。

生成图片的代码是

# Values is a [(ndarray, string)]
fig, axes = plt.subplots(len(values), sharex=True)
for ax, (value, plot_name) in zip(axes, values):
    im = ax.imshow(value, vmax=1.0, vmin=0.0)
    ax.set_title(plot_name)

# (Hack) Apply on the last one
plt.xticks(range(values.shape[1]), ticks, rotation=90)
plt.colorbar(im, ax=axes.ravel().tolist())

fig.savefig(output_name, bbox_inches="tight")

一个示例图像是:

【问题讨论】:

  • 将第一行更改为 fig, axes = plt.subplots(len(foo), sharex=True, subplot_kw={"frame_on": False}) 会使框消失,但刻度线会以一种尴尬的方式浮动

标签: python matplotlib


【解决方案1】:

gridspec_kw={"hspace": 0.8} 参数添加到plt.subplots 构造函数使其对我有用。这控制了我相信的子图之间的垂直空间

ticks = ["blah" for i in range(17)]
# Values is a [(ndarray, string)]
values = [(np.random.randn(3,17), "Title") for i in range(3)]
fig, axes = plt.subplots(len(values), sharex=True, gridspec_kw={"hspace": 0.8})
for ax, (value, plot_name) in zip(axes, values):
    im = ax.imshow(value, vmax=1.0, vmin=0.0)
    ax.set_title(plot_name)

# (Hack) Apply on the last one
plt.xticks(range(values[0][0].shape[1]), ticks, rotation=90)
plt.colorbar(im, ax=axes.ravel().tolist())

plt.show()

【讨论】:

    【解决方案2】:

    不幸的是,当使用sharex=True 时,绘图的方面不能设置为"equal"。可能有两种解决方案:

    不共享坐标轴

    共享轴并不是真正必要的,因为所有子图都具有相同的维度。所以这个想法是不共享任何轴,而只是删除上面图的刻度标签。

    import matplotlib.pyplot as plt
    import numpy as np
    
    values = [np.random.rand(3,10) for i in range(3)]
    
    fig, axes = plt.subplots(len(values))
    for i, (ax, value) in enumerate(zip(axes, values)):
        im = ax.imshow(value, vmax=1.0, vmin=0.0)
        ax.set_title("title")
        ax.set_xticks(range(value.shape[1]))
        if i != len(axes)-1:
            ax.set_xticklabels([])
        else:
            plt.setp(ax.get_xticklabels(), rotation=90)
    
    plt.colorbar(im, ax=axes.ravel().tolist())
    
    
    plt.show()
    

    使用ImageGrid

    使用来自mpl_toolkits.axes_grid1 模块的ImageGrid 提供了一个专门用于等方面图的网格。它可以如下使用。这里的一个主要优点是颜色条会自动与子图的大小相同。

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import ImageGrid
    
    values = [np.random.rand(3,10) for i in range(3)]
    
    axes = ImageGrid(plt.figure(), 111,
                     nrows_ncols=(3,1),
                     axes_pad=0.3,
                     share_all=True,
                     cbar_location="right",
                     cbar_mode="single",
                     cbar_size="2%",
                     cbar_pad=0.15,
                     label_mode = "L"
                     )
    
    for i, (ax, value) in enumerate(zip(axes, values)):
        im = ax.imshow(value, vmax=1.0, vmin=0.0)
        ax.set_title("title")
        ax.set_xticks(range(value.shape[1]))
    
    plt.setp(ax.get_xticklabels(), rotation=90)
    
    ax.cax.colorbar(im)
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      相关资源
      最近更新 更多