如何在Matplotlib中完全自定义子图大小

时间:2018-09-28 17:57:13

标签: matplotlib

我想在matplotlib图中有两个子图,如下图所示(相对于样式而言),它们的大小和位置相对于彼此。我见过的所有用于自定义子图放置和大小的示例都将平铺并填充整个图形覆盖区。我该怎么做才能在最右边的图上放置一些如下所示的空白?

enter image description here

2 个答案:

答案 0 :(得分:2)

您需要想象一下放置子图的一些(虚拟)网格。

enter image description here

网格有3行2列。第一个子图涵盖所有三行和第一列。第二个子图仅覆盖第二列的第二行。行和列的大小比例不一定相等。

import matplotlib.pyplot as plt
import matplotlib.gridspec

gs = matplotlib.gridspec.GridSpec(3,2, width_ratios=[1,1.4], 
                                       height_ratios=[1,3,1])

fig = plt.figure()
ax1 = fig.add_subplot(gs[:,0])
ax2 = fig.add_subplot(gs[1,1])

plt.show()

enter image description here

此外,您仍可以为hspacewspace参数设置不同的值。

GridSpec tutorial中有很好的概述。


因为它在评论中提到:如果可能需要以英寸为单位的绝对定位,我建议直接添加所需大小的轴,

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
w,h = fig.get_size_inches()
div = np.array([w,h,w,h])

# define axes in by rectangle [left, bottom, width, height], numbers in inches
ax1 = fig.add_axes(np.array([.7, .7, 1.8, 3.4])/div)
ax2 = fig.add_axes(np.array([3, 1.4, 3, 2])/div)

plt.show()

答案 1 :(得分:1)

-编辑:该答案的结尾与@ImportanceOfBeingErnest给出的答案惊人地相似,但是采用了以英寸为单位而不是分数单位的布局控制方法。 -

如果用gridspec将其网格化,然后使用所需的比率或列跨度填充网格,则将很有帮助。对于很多图形,我需要使它们很好地适合页面,因此我经常使用此模式来使网格控制降低到十分之一英寸。

import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure(figsize=(7, 5)) # 7 inches wide, 5 inches tall
row = int(fig.get_figheight() * 10)
col = int(fig.get_figwidth() * 10)
gsfig = gridspec.GridSpec(
    row, col, 
    left=0, right=1, bottom=0,
    top=1, wspace=0, hspace=0)

gs1 = gsfig[:, 0:30] 
# these spans are in tenths of an inch, so left-right 
# spans from col 0 to column 30 (or 3 inches)

ax1 = fig.add_subplot(gs1)

gs1 = gsfig[20:40, 35:70] # again these spans are in tenths of an inch
ax1 = fig.add_subplot(gs1)

generator