使用mfrow

时间:2019-05-06 11:29:03

标签: r plot graph bar-chart par

我想使用底数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 :(得分:0)

parpdf(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_chopplot1.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