【问题标题】:How to create multiple plots, each with same plot area size, when only one plot has axis labels?当只有一个地块有轴标签时,如何创建多个地块,每个地块都具有相同的地块面积?
【发布时间】:2012-09-16 08:15:47
【问题描述】:

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

[更新:我选择了最直接回答我的问题的答案,即基本图形,但我建议也查看其他解决方案,因为它们展示了如何做同样的事情在latticeggplot2。]

【问题讨论】:

    标签: r layout graphics plot


    【解决方案1】:

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

    【讨论】:

    • 更改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)不会重置整个页面。外边距在所有框架之外,需要在整个“页面”中保持不变。
    【解决方案2】:

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

    但是像这样的任务是发明lattice(和ggplot,就此而言)的原因之一。您也可以考虑使用点图,尤其是如果您是 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)
    

    【讨论】:

      【解决方案3】:

      我可能可以使用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()
      

      【讨论】:

        【解决方案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() 时分配所有参数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 2023-03-26
          • 2020-07-08
          • 2016-06-04
          • 2019-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多