8

我想在 1x3 布局中绘制三个图表。只有第一张图需要有垂直轴标签,但我希望所有三个绘图区域的大小完全相同。如果没有或所有图表都有轴标签,这将没有问题。但是,当一个有轴标签而另外两个没有轴标签时,如何使所有三个图形的大小相同?我正在尝试在基本图形中执行此操作,因为这是我最了解的,但如果它们提供更好的方法来解决我的问题,我会很乐意使用 grid 或 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。]

在此处输入图像描述

4

4 回答 4

8

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

于 2012-09-24T21:13:24.783 回答
7

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

lattice但是像这样的任务是发明(并且ggplot,就此而言)的原因之一。您也可以考虑使用点图,尤其是如果您是威廉克利夫兰的粉丝。

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)

在此处输入图像描述 在此处输入图像描述

于 2012-09-24T20:38:52.877 回答
6

我可能可以使用 拼凑一些东西layout,但使用ggplot2的 faceting 功能更快:

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()

在此处输入图像描述

于 2012-09-24T20:33:45.627 回答
4

扩展 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)

避免您提到的“重置”的关键是在一次调用 par() 时分配所有参数

于 2012-09-24T23:28:31.383 回答