Отрегулируйте размер / ширину графиков при использовании mfrow

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

Я использовал par (mfrow = c (...)), чтобы расположить несколько столбцов на одной фигуре. У меня нет проблем с изготовлением самих цифр, но когда я сохраняю цифры, ширина полос и меток различаются по размеру.

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

Вот простой пример:

png(filename="plot1.png", width=200, height=300, bg="white")
par(mfrow = c(1, 2), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))

barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()

png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow = c(1, 4), mar = c(1, 2, 1, 1), oma = c(0, 0, 0, 0))

barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
barplot(height = c(2,3), width = 1, xlim = c(0,2))
dev.off()

Сюжет 1:

Рисунок 1

Сюжет 2:

Рисунок 2


person Vincent H.    schedule 06.05.2019    source источник
comment
comment
К сожалению нет. Даже когда я использую код для экспорта графиков, как предложено в этом ответе, мои проблемы с неравной шириной полос и метками меток остаются. Я отредактировал свой вопрос, чтобы было понятнее.   -  person Vincent H.    schedule 08.05.2019


Ответы (1)


Наверное, par и pdf(width, height) должны быть равны.

png(filename="plot1.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()

png(filename="plot2.png", width=400, height=300, bg="white")
par(mfrow=c(1, 4), mar=c(1, 2, 1, 1), oma=c(0, 0, 0, 0))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))
dev.off()

Другое решение - использовать layout.

def.par <- par(no.readonly=TRUE) # save par default, for resetting...

# 1 x 2 plot
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=2)  # to inspect layout                        # MARK
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))

# 1 x 4 plot
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
layout.show(n=4)  # to inspect layout
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))

# 2 x 4 plot
layout(matrix(c(1:2, 0, 0, 3:6), nrow=2, ncol=4, byrow=TRUE))
layout.show(n=6)  # to inspect layout
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2)))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2)))

par(def.par)  # reset to default

Однако оба решения дают полупустой график 1, причину можно увидеть в коде выше в # MARK.

Мы могли бы использовать пакет magick, чтобы нарезать первый график до желаемого содержания. Сначала мы создаем *.png вторым методом.

clr <- "#ED7C22"  # color

png(filename="plot1.png", width=400, height=300, bg="white")
layout(matrix(c(1:2, 0, 0), nrow=1, ncol=4, byrow=TRUE))
replicate(2, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()

png(filename="plot2.png", width=400, height=300, bg="white")
layout(matrix(c(1:4), nrow=1, ncol=4, byrow=TRUE))
replicate(4, barplot(height=c(2,3), width=1, xlim=c(0,2), col=clr, border=0))
dev.off()

Теперь, используя image_chop, мы обрезаем plot1.png до левой половины.

library(magick)
(i <- image_read("plot1.png"))
i.chopped <- image_chop(i, "200x+200")  # says: trim by 200px at pos. 200

Наконец, мы экспортируем нарезанное изображение.

image_write(i.chopped, path="plot1.ch.png", format="png")

Участок 1 (рубленый)

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

Сюжет 2

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

person jay.sf    schedule 08.05.2019
comment
Спасибо за Ваш ответ. Я пробовал это, но потом у меня получилась правая половина первого участка в виде белого пространства. Это невыгодно, когда я хочу, чтобы график занимал всего половину страницы в моем документе. - person Vincent H.; 10.05.2019
comment
Вы абсолютно правы, это некрасиво. Есть решение, применяющее magick::image_chop, см. Обновление. - person jay.sf; 10.05.2019
comment
Это хороший способ решения этой проблемы. Спасибо. Но я до сих пор не понимаю, почему R меняет пропорции графиков, когда я использую четыре графика вместо двух с удвоенной шириной изображения. Нет ли объяснения этому явлению? - person Vincent H.; 16.05.2019
comment
@VincentH. Сюжеты автоматически корректируются изнутри, поэтому свободное пространство не создается. В связи с этим это решение было обобщено, вероятно потому, что это происходит чаще, чем вам нужны наборы графиков разного размера с одинаковым соотношением сторон каждый. Однако я пропустил параметр aspect в barplot. Поскольку plot имеет эту опцию, возможно, стоит проверить, дает ли plot равные аспекты, установив эту опцию. - person jay.sf; 16.05.2019