防止GridSpec子图分离随图形大小而变化

问题描述 投票:5回答:4

我想创建一个没有中间空间的图形网格。

看起来像这样:

enter image description here

代码1

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

fig = plt.figure()

gs = GridSpec(2, 2, wspace=0.0, hspace=0.0)

ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, 0])
ax4 = fig.add_subplot(gs[1, 1])

fig.show()

但是,当我添加数据时,子图之间的间距取决于图的尺寸。 (通过改变fig.show()打开的窗口的尺寸可以看出。)

举个例子:

enter image description here

代码2

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

import numpy as np

fig = plt.figure()

gs = GridSpec(2, 2, wspace=0.0, hspace=0.0)

ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, 0])
ax4 = fig.add_subplot(gs[1, 1])

for axis in [ax1, ax2, ax3, ax4]:
    axis.imshow(np.random.random((10,10)))

fig.show()

因此,最好还是使用GridSpec,是否可以强制将图保持在一起? 我能想到的唯一另一种选择是访问图的大小并在plt.figure(figsize=(##,##))中使用这些尺寸,但我似乎无法访问这些数字。

注意:图的数量和高/宽比都会有所不同。 (例如qazxsw指向我将使用最后一列来保存用于所有绘图的颜色条。)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ Python 2.7.10,Matplotlib 1.4.3 ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~

python python-2.7 matplotlib plot
4个回答
4
投票

我发现了两种快速而肮脏的方法:

Method 1: Using GridSpec(2, 3, width_ratios=[10,10,1], wspace=0.0, hspace=0.0)

figsize中设置figsize关键字参数,其宽度和高度与数据的相同宽高比相匹配,相当不错。

plt.figure

方法1

Result from Method 1

Method 2: Using import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import numpy as np length_x_axis = 30 length_y_axis = 10 rows = 3 columns = 2 fig_height = 5. height = length_y_axis * rows width = length_x_axis * columns plot_aspect_ratio= float(width)/float(height) fig = plt.figure(figsize=(fig_height * plot_aspect_ratio, fig_height )) gs = GridSpec(rows, columns, wspace=0.0, hspace=0.0) ax1 = fig.add_subplot(gs[0, 0]) ax2 = fig.add_subplot(gs[0, 1]) ax3 = fig.add_subplot(gs[1, 0]) ax4 = fig.add_subplot(gs[1, 1]) ax5 = fig.add_subplot(gs[2, 0]) ax6 = fig.add_subplot(gs[2, 1]) for axis in [ax1, ax2, ax3, ax4, ax5, ax6]: axis.imshow(np.random.random((length_y_axis , length_x_axis ))) fig.savefig("testing.png")

对每个轴使用set_anchor方法可以获得更好的结果,但需要更多的努力,并且从一些快速测试中,它不适用于大于3x2的绘图数组。

set_anchor

方法2

Result from Method 2

1
投票

据我所见,import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import numpy as np fig = plt.figure() gs = GridSpec(2, 3, wspace=0.0, hspace=0.0) ax1 = fig.add_subplot(gs[0, 0]) ax1.set_anchor("SE") ax2 = fig.add_subplot(gs[0, 1]) ax2.set_anchor("S") ax3 = fig.add_subplot(gs[0, 2]) ax3.set_anchor("SW") ax4 = fig.add_subplot(gs[1, 0]) ax4.set_anchor("NE") ax5 = fig.add_subplot(gs[1, 1]) ax5.set_anchor("N") ax6 = fig.add_subplot(gs[1, 2]) ax6.set_anchor("NW") for axis in [ax1, ax2, ax3, ax4, ax5, ax6]: axis.imshow(np.random.random((10 , 10 ))) fig.show() 不会覆盖您设置的默认gridspecfigsize


1
投票

默认情况下,plt.rcParams['figure.figsize'] = (16,8)使用imshow,所以你的情节变成了方形。尝试使用aspect=equal来防止这种情况。


0
投票

你可以做一个aspect=auto

以上链接的matplotlib示例代码生成:

Nested GridSpec using SubplotSpec

代码,来自enter image description here

here
© www.soinside.com 2019 - 2024. All rights reserved.