Масштабирование графики без масштабирования меток, текста, делений осей и т. д.

У меня проблема с масштабированием моей графики. Я использую imshow для построения двух матриц, первая из которых представляет собой матрицу 2x2, а вторая - матрицу 5x5. Теперь я хочу, чтобы оба имели одинаковый размер полей, представляющих записи матриц. Но я хочу, чтобы они были одинаковыми по абсолютному размеру (например, пикселям). Если я нарисую оба и четко сравню их, поля матрицы 2x2 будут намного больше по сравнению с числами внутри, чем матрица 5x5. матрица 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")

person Hauptsatz.mp3    schedule 04.10.2018    source источник


Ответы (1)


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

Другими словами, если вы создадите сетку 2x2 на изображении размером 2 дюйма x 2 дюйма, то каждая ячейка будет чуть меньше 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()
person Diziet Asahi    schedule 04.10.2018
comment
Первый: Спасибо! Но, похоже, я сам неправильно понял проблему и поэтому не отобразил ее правильно. Дело в том, что я также использую тексты меток в моей реальной графике рядом с матрицами. Затем параметр figsize также учитывает эти метки, а затем неправильно масштабирует мои блоки. Я мог бы просто угадать правильный фиговый размер, чтобы исправить это (еще раз спасибо), но вы также знаете лучший вариант? Что-то, что напрямую изменяет размер сюжетной части, не изменяя размер остального изображения или размер субфигуры. - person Hauptsatz.mp3; 04.10.2018
comment
Я думаю, вам просто нужно понять, как рассчитать все размеры, которые вам нужны, чтобы создать фигуру нужного размера. Я бы посоветовал вам создать достаточно большую фигуру и создать Axes желаемого размера (в абсолютных размерах в дюймах). См. эту ссылку для начала (последняя часть об абсолютном позиционировании): stackoverflow.com/a/52560728/1356000 - person Diziet Asahi; 04.10.2018