Связь между dpi и размером фигуры

Я создал фигуру с использованием matplotlib, но я понял ось графика, и рисованная линия уменьшилась. введите описание изображения здесь

Прочитав этот более ранний поток обсуждения, в нем объясняется, как установить размер фигуры.

fig, ax = plt.subplots()

fig.set_size_inches(3, 1.5)

plt.savefig(file.jpeg, edgecolor='black', dpi=400, facecolor='black', transparent=True)

С приведенным выше кодом (другие конфигурации удалены для краткости), я получаю результирующий файл изображения с 1200 X 600 желаемыми размерами (должен ли мы сказать разрешение тоже?) И желаемый размер файла.

Проецируемое изображение масштабируется необычным образом, например аннотации. Я могу установить размер меток на оси, но фигура по-прежнему выглядит не пропорциональной по отношению к шкале, так как нижний и правый шипы все еще большие, и так же это построенная линия.

Итак, вопрос в том, как мы исправим эту проблему, какие конфигурации идут не так?

1
04 дек. '17 в 15:35
источник поделиться
1 ответ

Размер рисунка (figsize) определяет размер фигуры в дюймах. Это дает объем пространства, в котором оси (и другие элементы) находятся внутри фигуры. Размер фигуры по умолчанию составляет (6.4, 4.8) дюймов в matplotlib 2. Более крупный размер фигуры позволит показывать более длинные тексты, больше осей или больше меток.

Точки на дюйм (dpi) определяет, сколько пикселей содержит фигура. Значение dpi по умолчанию в matplotlib равно 100. Рисунок figsize=(w,h) будет иметь

px, py = w*dpi, h*dpi  # pixels
# e.g.
# 6.4 inches * 100 dpi = 640 pixels

Таким образом, чтобы получить фигуру с размером пикселей, например. (1200,600) вы можете выбрать несколько комбинаций размера фигуры и dpi, например.

figsize=(15,7.5), dpi= 80
figsize=(12,6)  , dpi=100
figsize=( 8,4)  , dpi=150
figsize=( 6,3)  , dpi=200
etc.

Теперь, в чем разница? Это определяется размером элементов внутри фигуры. Большинство элементов, таких как линии, маркеры, тексты, имеют размер, указанный в точках.
В рисунках Matplotlib используется Точки на дюйм (ppi) из 72. Линия с толщиной 1 балла будет равна 1./72. дюйм шириной. Текст с размером шрифта 12 пунктов будет 12./72. дюймовый.

Конечно, если вы измените размер фигуры в дюймах, точки не изменятся, поэтому большая фигура в дюймах по-прежнему будет иметь одинаковый размер элементов. Изменение размера фигуры, таким образом, похоже на взятие листа бумаги другого размера. Выполнение этого, конечно, не изменило бы ширину линии, нарисованной с помощью того же пера.

С другой стороны, изменение dpi масштабирует эти элементы. При 72 dpi линейка размером 1 байт составляет один пиксель. При 144 dpi эта линия имеет 2 пикселя. Таким образом, большие dpi будут действовать как увеличительное стекло. Все элементы масштабируются с помощью увеличительной силы объектива.

Сравнительный пример для постоянного размера фигуры и изменяемого значения dpi показан на рисунке ниже слева. Справа вы видите постоянный dpi и изменяющийся размер фигуры. Цифры в каждой строке имеют одинаковый размер пикселей.

введите описание изображения здесь

Код для воспроизведения:

import matplotlib.pyplot as plt
%matplotlib inline

def plot(fs,dpi):
    fig, ax=plt.subplots(figsize=fs, dpi=dpi)
    ax.set_title("Figsize: {}, dpi: {}".format(fs,dpi))
    ax.plot([2,4,1,5], label="Label")
    ax.legend()

figsize=(2,2)
for i in range(1,4):
    plot(figsize, i*72)

dpi=72
for i in [2,4,6]:
    plot((i,i), dpi)
2
04 дек. '17 в 21:18
источник

Посмотрите другие вопросы по меткам или Задайте вопрос