R 当只有一个打印具有轴标签时,如何创建多个打印,每个打印具有相同的打印区域大小?

R 当只有一个打印具有轴标签时,如何创建多个打印,每个打印具有相同的打印区域大小?,r,layout,graphics,plot,R,Layout,Graphics,Plot,我想在1x3布局中绘制三个图形。只有第一个图形需要有垂直轴标签,但我希望所有三个绘图区域的大小完全相同。如果没有或所有图形都有轴标签,这将不会有问题。但是,当一个有轴标签,而另外两个没有时,如何使所有三个图形的大小相同呢?我试图在基本图形中实现这一点,因为这是我最了解的,但如果网格或ggplot2能提供更好的方法来解决我的问题,我很乐意使用它们 以下是一些虚假数据、我的绘图代码和绘图本身: # Fake Data data = structure(list(y1 = 1:5, y2 = c(1.

我想在1x3布局中绘制三个图形。只有第一个图形需要有垂直轴标签,但我希望所有三个绘图区域的大小完全相同。如果没有或所有图形都有轴标签,这将不会有问题。但是,当一个有轴标签,而另外两个没有时,如何使所有三个图形的大小相同呢?我试图在基本图形中实现这一点,因为这是我最了解的,但如果网格或ggplot2能提供更好的方法来解决我的问题,我很乐意使用它们

以下是一些虚假数据、我的绘图代码和绘图本身:

# Fake Data
data = structure(list(y1 = 1:5, y2 = c(1.2, 2.4, 3.6, 4.8, 6), y3 = c(1.44, 
2.88, 4.32, 5.76, 7.2)), .Names = c("y1", "y2", "y3"), 
row.names = c("I needed 12 units for financial aid", 
              "I couldn't find any other open classes",
              "I might be adding a major or minor", 
              "The class seemed interesting", "The class fit into my schedule"
), class = "data.frame")

# Plotting code
par(mar=c(5,15,4,1))
par(mfrow=c(1,3))
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, +
        xlim=c(0,8), main="Group 1")
par(mar=c(5,1,4,1))
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, +
        axisnames=FALSE, xlim=c(0,8), main="Group 2")
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, +
        axisnames=FALSE, xlim=c(0,8), main="Group 3")

# Reset plot options back to defaults
par(mfrow=c(1,1)
par(mar=c(5,4,4,2)+0.1)
[更新:我选择了最直接回答我问题的答案,这是在基本图形中,但我建议也看看其他解决方案,因为它们在
lattice
ggplot2
中展示了如何做同样的事情


我可能可以使用
布局将一些东西拼凑在一起,但使用ggplot2的刻面功能会更快:

data$grp <- rownames(data)
datam <- melt(data,id.vars = "grp")
ggplot(datam,aes(x = grp,y = value)) + 
    facet_wrap(~variable,nrow = 1) + 
    geom_bar(stat = "identity") + 
    coord_flip()

data$grp使用基本图形最简单的方法可能是使它们都没有y轴标签,然后在所有三个标签左侧的附加面板中分别添加标签

但是像这样的任务是
lattice
(以及
ggplot
)被发明的原因之一。你也可以考虑一个dot情节,特别是如果你是威廉克利夫兰球迷。

library(reshape2)
d2 <- data
d2$q <- rownames(d2)
d2 <- melt(d2, measure.vars=1:3, id.vars=4)
d2$q <- factor(d2$q, levels=rownames(data))

library(lattice)
barchart(q ~ value|variable, data=d2)
dotplot(q ~ value|variable, data=d2)
library(重塑2)

d2对于基础图形,您希望使用外部边距,而不是常规边距。只需将第一个
par(mar=c(5,15,4,1))
替换为
par(oma=c(0,15,0,0))
,并删除对
par
的第二个调用,绘图将占用相等的空间(轴标签将粘贴到左侧的外缘)。

扩展Greg Snow的答案(根据您后续的问题)下面是对您的代码进行的最小编辑,可以使用基本图形进行编辑:

op <- par(oma=c(0,15,0,0), mfrow=c(1,3), mar=c(5,1,4,1))
barplot(data$y1,names.arg=row.names(data), horiz=TRUE,las=1, xlim=c(0,8), main="Group 1")
barplot(data$y2,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 2")
barplot(data$y3,names.arg=row.names(data), horiz=TRUE,las=1, axisnames=FALSE, xlim=c(0,8), main="Group 3")
par(op)

op更改
oma
设置似乎会“重置”绘图区域。例如,如果我使用
oma=c(0,15,0,0)
绘制第一个绘图,然后调用
par(oma=c(0,0,0,0))
,然后再调用
plot(…)
,我将得到两个单独的绘图,而不是同一“页面”上的两个绘图。有没有办法告诉R在第一次绘图后保持相同的1x3绘图区域,即使我调用了
oma
?@eipi10您应该只设置
oma
参数一次,不要在各个帧之间更改它。这很有效,谢谢。出于好奇,为什么不在绘制第一个绘图后将oma重置为c(0,0,0,0)呢?此外,为了便于将来参考,在某些情况下,如果用户希望在绘图之间更改图形参数,是否有方法防止R重置绘图区域?
oma
参数(如
mfrow
参数)和其他参数处理整个绘图设备,因此更改它们将重置页面。仅处理单个帧的参数(如
mar
)不会重置整个页面。外部边距位于所有框架之外,需要在整个“页面”中保持不变。