Отрегулируйте размер / ширину графиков при использовании mfrow - PullRequest
1 голос
/ 06 мая 2019

Я хочу получить две цифры, используя основание 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:

Figure 1

Сюжет 2:

Figure 2

1 Ответ

0 голосов
/ 08 мая 2019

Возможно 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 («рубленый»)

enter image description here

Участок 2

enter image description here

...