缩放图形而不缩放标签、文本和轴刻度等

Scaling graphic without scaling labels, text and axis ticks etc

我的图形缩放有问题。我使用 imshow 绘制两个矩阵,第一个是 2x2 矩阵,第二个是 5x5 矩阵。我现在要让两者具有相同大小的框来表示矩阵的条目。但我希望它们的绝对大小(如像素)相同。 如果我绘制两者并清楚地比较它们,则 2x2 矩阵框相对于内部数字比 5x5 矩阵大得多。 2x2 matrix, too big boxes 5x5 matrix, right box size 我尝试使用 plt.figure() 函数的 "figsize" 参数,但这也会重新调整框中的数字。 我尝试的另一件事是 imshow 的 "extent" 参数,如果我试图让盒子变小,它就不起作用。它只是扩大了他们的规模。 (如果我使边界框变宽,它会起作用,然后它会自动使它们变薄,但这不是我想要的,下面的示例)。 with use of extent: wider and thinner but I don't what that

再说一次:我有点想调整框的大小,但不要更改 text/numbers 的大小,这样如果我在一篇文章中将图形并排放置,它看起来就不会乱七八糟.它不一定是一种自动匹配两个图形框大小的方法,我已经对任何调整框大小的方法感到满意,因为它不必 100% 准确。 任何人都知道我该怎么做? 已经非常感谢了!!

这是两个带有二次方框的图形的代码(我想要的,但只是改变了大小):

import matplotlib.pyplot as plt
import numpy as np
plt.style.use("seaborn-dark")

def gfx_1():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 1.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("2x2.png")


def gfx_2():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7], [6, 7, 8, 9, 10], [9, 10, 11, 12, 13], [12, 13, 14, 15, 16]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 4.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 4.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("5x5.png")

和修改后的扩展(我不知道):

def gfx_1():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest", extent=(-0.5, 3.5, -0.5, 1.5))
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i*2, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 3.5, 2.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("2x2_wide.png")

我认为您已经使用 figsize 找到了正确答案。当然,使用 2x2 网格生成的图像可能看起来更大,但这可能只是图像可视化程序中缩放的问题。如果您以原始分辨率并排显示它们,则这些方块看起来大小相同。

换句话说,如果您在 2 英寸 x 2 英寸的图像中创建一个 2x2 的网格,那么每个框的宽度将略小于 1 英寸(因为轴和其他所有因素)。如果您在 5x5 英寸的图像中创建 5x5 的网格,那么框仍然大约 1 英寸宽

这里使用以下代码创建了两张图片,并在图片编辑器中将它们并排复制粘贴:

def gfx_1():
    fig = plt.figure(figsize=(2,2))
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 1.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("./2x2.png")


def gfx_2():
    fig = plt.figure(figsize=(5,5))
    ax1 = plt.subplot(111)
    data = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7], [6, 7, 8, 9, 10], [9, 10, 11, 12, 13], [12, 13, 14, 15, 16]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 4.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 4.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("./5x5.png")

gfx_1()
gfx_2()