matplotlib 如何完全自定义子区大小

dzhpxtsq  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(172)

我希望在matplotlib图形中有两个子图,它们的大小和位置都像下面的例子一样(出于风格原因)。我看到的所有定制子图位置和大小的例子仍然平铺并填充整个图形的覆盖区。我该怎么做才能让最右边的图像下面这样用一些空格定位?

zu0ti5jz

zu0ti5jz1#

你需要想象一些(虚拟的)网格来放置子情节。

网格有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()

此外,您还可以为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()
pdtvr36n

pdtvr36n2#

--编辑:这个答案与@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)

相关问题