缩放图形而无需缩放标签,文本和轴刻度等

时间:2018-10-04 10:20:43

标签: python matplotlib graphics imshow

我的图形缩放比例有问题。我使用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

现在再次:我有点想调整框的大小,但不要更改文本/数字的大小,这样如果我在文章中将图形紧挨着放置,它看起来就不会转储。它不一定是自动匹配两个图形框大小的一种方法,我已经对任何调整框大小的方法都感到满意,因为它不必是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")

1 个答案:

答案 0 :(得分:0)

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

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

使用以下代码在此处创建两个图像,并在图像编辑器中并排粘贴它们: enter image description here

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()