matplotlib.pyplot平面图形,具有相等的纵横比和紧凑的布局。

3
我想在等比例轴上绘制一组多边形,并对图形应用紧凑布局。然而,当同时使用等比例和紧凑布局时,似乎无法正确调整图形大小。

尝试1

等比例和紧凑布局

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

fig, ax = plt.subplots(1,1)
l = 5
h = 1
poly = Polygon(
    np.array([
        [0,0],
        [l,0],
        [l,h],
        [0,h]
    ]),
    edgecolor="black",
    facecolor="gray",
)
ax.add_patch(poly)
ax.set_aspect("equal")
ax.set_xlim(0,l)
ax.set_ylim(0,h)
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"$y$", rotation=0, labelpad=5)
fig.tight_layout(pad=0.25)
plt.show()

输出:注意顶部和底部的额外空间。还要注意,y轴标签超出了范围。

enter image description here

尝试2

没有等比例的紧凑布局

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

fig, ax = plt.subplots(1,1)
l = 5
h = 1
poly = Polygon(
    np.array([
        [0,0],
        [l,0],
        [l,h],
        [0,h]
    ]),
    edgecolor="black",
    facecolor="gray",
)
ax.add_patch(poly)
# ax.set_aspect("equal")
ax.set_xlim(0,l)
ax.set_ylim(0,h)
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"$y$", rotation=0, labelpad=5)
fig.tight_layout(pad=0.25)
plt.show()

输出:工作正常,除了纵横比不相等。

enter image description here

如何实现紧凑布局和等比例缩放?
1个回答

1
如果图形的宽高比(默认大小为rcParams["figure.figsize"],即[6.4, 4.8],即1.33的宽高比)与轴的宽高比不同,则会出现额外的边距。为了避免这种情况,您需要调整图形的宽高比以匹配包括刻度和标签在内的轴的宽高比。您可以使用get_tightbbox获取它,在绘制图形后使用(例如使用draw_without_rendering)。

为了获得更好的视觉效果,建议使用constrained而不是tight布局。

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

fig, ax = plt.subplots(1,1, layout='constrained')
l = 5
h = 1
fig.set_size_inches(10,2)
poly = Polygon(
    np.array([
        [0,0],
        [l,0],
        [l,h],
        [0,h]
    ]),
    edgecolor="black",
    facecolor="gray",
)
ax.add_patch(poly)
ax.set_aspect("equal")
ax.set_xlim(0,l)
ax.set_ylim(0,h)
ax.set_xlabel(r"$x$")
ax.set_ylabel(r"$y$", rotation=0, labelpad=5)

# adjust Figure aspect ratio to match Axes
fig.draw_without_rendering()
tb = fig.get_tightbbox(fig.canvas.get_renderer())
fig.set_size_inches(tb.width, tb.height)

plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接