首页 文章

如果只有一个绘图有轴标签,如何创建多个绘图,每个绘图具有相同的绘图区域大小?

提问于
浏览
7

我想在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)

[ Update: 我选择了最直接回答我的问题的答案,这是基本图形,但我建议同时查看其他解决方案,因为它们显示如何在 latticeggplot2 中执行相同的操作 . ]

enter image description here

4 回答

  • 4

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

  • 7

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

    但是这样的任务是为什么发明了 lattice (以及 ggplot )的原因之一 . 你也可以考虑一个dotplot,特别是如果你是William Cleveland的粉丝 .

    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)
    

    enter image description here

    enter image description here

  • 6

    我可以使用 layout 将一些东西拼凑在一起,但使用 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()
    

    enter image description here

  • 8

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

相关问题