【问题标题】:Add a verticle line between matplotlib subplots在 matplotlib 子图之间添加一条垂直线
【发布时间】:2019-04-02 08:17:49
【问题描述】:

您好,我已经制作了这个子图,这里的图像分为 4 列,我的想法是将它们成对进行比较,即第 1 列与第 2 列,第 3 列与第 4 列。但在这里,它现在看起来有点令人困惑。是否可以以某种方式在第二列和第三列之间添加一条垂直线?所以看起来前两列是在一起的,另外两列是成对的?有什么可能的方法吗?

import matplotlib.pyplot as plt

indexes = [1000,1001]

indexes2 = [1010,1011]
columns = 4
rows = len(indexes)
f, axarr = plt.subplots(rows, columns,figsize=(10,10))
k = 0
for i in range(0, rows):
    axarr[i, 0].set_title(str(indexes[k])+"-Patch 1",fontsize=15)    
    axarr[i, 1].set_title(str(indexes[k])+"-Patch 2",fontsize=15)

    axarr[i, 2].set_title(str(indexes2[k])+"-Patch 1",fontsize=15)    
    axarr[i, 3].set_title(str(indexes2[k])+"-Patch 2",fontsize=15)

    k = k+1
    axarr[i, 0].set_xticks([])
    axarr[i, 1].set_xticks([])
    axarr[i, 0].set_yticks([])
    axarr[i, 1].set_yticks([])

    axarr[i, 2].set_xticks([])
    axarr[i, 3].set_xticks([])
    axarr[i, 2].set_yticks([])
    axarr[i, 3].set_yticks([])

plt.tight_layout()

我已经添加了如何获得子图的代码。如果对回答问题有帮助。感谢您的时间。 :)

如果问题不清楚,我需要这样的一行,我在下图中的图像编辑器中添加。

【问题讨论】:

  • 好吧,我不能分享整个数据集,剩下的代码已经在这里了。所以我可以用示例图像创建另一个演示。请给我一点时间。
  • 我更新了最小代码,在主要问题中,我意识到在这种情况下,图像到底是什么并不重要,对吧?

标签: python matplotlib


【解决方案1】:

线

添加一行就这么简单

line = plt.Line2D((.5,.5),(.1,.9), color="k", linewidth=3)
fig.add_artist(line)

import matplotlib.pyplot as plt
import numpy as np

a = np.random.rand(10,10,8)
columns = 4
rows = a.shape[2]//columns

fig, axarr = plt.subplots(rows, columns)
fig.subplots_adjust(left=0.1, right=0.9,  wspace=0.4)

for i, ax in enumerate(axarr.flat):
    img = a[:,:,i]
    ax.imshow(img)
    ax.set_title("-Patch {}".format(i))    

line = plt.Line2D((.5,.5),(.1,.9), color="k", linewidth=3)
fig.add_artist(line)

plt.show()

如需更复杂的线条解决方案,请参阅Draw a separator or lines between subplots

空格

但是,您可能更愿意调整绘图之间的间距。

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import numpy as np

a = np.random.rand(10,10,8)
columns = 4
rows = a.shape[2]//columns


fig = plt.figure()
axarr1 = fig.subplots(2,2, gridspec_kw=dict(left=0.05, right=0.43, wspace=0.4))
axarr2 = fig.subplots(2,2, gridspec_kw=dict(left=0.57, right=0.95, wspace=0.4))


for i, ax in enumerate(axarr1.flat):
    img = a[:,:,i]
    ax.imshow(img)
    ax.set_title("-Patch {}".format(i)) 

for i, ax in enumerate(axarr2.flat):
    img = a[:,:,i+4]
    ax.imshow(img)
    ax.set_title("-Patch {}".format(i+4)) 


plt.show()

这允许在视觉上分离两组子图,而不会在图中出现一些黑线。

【讨论】:

  • 非常感谢您提供的 line 解决方案,这正是我一直在寻找的东西。再次感谢您并为第二个解决方案 +1,这是我需要的!
  • 嗨,澄清一下,gs1 = GridSpec(2, 2, left=0.05, right=0.48, wspace=0.05) gs2 = GridSpec(2, 2, left=0.52, right=0.95, wspace=0.05) 因为 gridspec_kw 无论如何都被实例化了,所以这行并不是真正需要的,对吧? @ImportanceOfBeingErnest
  • Ups,抱歉,我正在输入两个可能的解决方案,但忘记删除其中一个。