Масштабирование графики без масштабирования надписей, отметок текста и осей и т. Д. - PullRequest
0 голосов
/ 04 октября 2018

У меня проблема с масштабированием моей графики.Я использую imshow для построения двух матриц, первая из которых представляет собой матрицу 2x2, а вторая - матрицу 5x5.Теперь я хочу, чтобы оба поля имели одинаковый размер, представляющий записи матриц.Но я хочу, чтобы они были одинаковыми в абсолютном размере (как пиксели).Если я построю оба и чётко их сравню, поля матрицы 2х2 будут намного больше относительно чисел внутри, чем матрица 5х5.* Матрица 2x2, слишком большие прямоугольники * Матрица 5x5, размер правильного прямоугольника Я попытался использовать параметр "figsize" функции plt.figure (), но при этом также меняются числа в полях,Еще одна вещь, которую я попробовал, - это параметр «экстент» в imshow, который не работал, если я просто попытался уменьшить размеры блоков.Это только увеличило их.(это работает, если я делаю ограничивающий прямоугольник шире, то он автоматически делает их тоньше, но это не то, что я хочу, пример ниже). с использованием экстента: шире и тоньше, но я не знаю, что это

Теперь еще раз: я хочу изменить размеры полей, но не изменяю размер текста / чиселтак что это не выглядит дамп, если я помещаю графику рядом друг с другом в статье.Это не должен быть способ автоматического соответствия двухразмерных блоков, я уже доволен любым способом изменения размеров блоков, поскольку он не должен быть точным на 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 голосов
/ 04 октября 2018

Я думаю, вы уже нашли правильный ответ, используя figsize.Конечно, результирующее изображение может выглядеть больше с сеткой 2x2, но это, вероятно, всего лишь вопрос увеличения вашей программы визуализации изображений.Если бы вы показывали их рядом с их собственным разрешением, квадраты выглядели бы одинаково.

Другими словами, если вы создаете сетку 2x2 на изображении размером 2 дюйма на 2 дюйма, тогда каждый блокбудет чуть меньше 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()
...