【问题标题】:Constant bar width in a barplot array in RR中的条形图数组中的恒定条形宽度
【发布时间】:2012-11-01 05:01:28
【问题描述】:

我正在尝试制作一个(1 行,3 列)条形图数组,这些条形图都具有相同的条形宽度

所有三个条形图都有不同数量的观测值,因此每个图的条形宽度最终不同(即,观测值最多的图具有最窄的条,而观测值最少的图具有最宽的条)。我从barplot {graphics}R 文档中了解到,

“除非指定了xlim,否则指定单个值不会有明显效果”

但是,我的x labels 是字符串,所以我不确定如何指定xlim。我不介意我的地块宽度是否不同,但我需要以某种方式指定吗?

这是一些假数据和我正在使用的代码...谢谢您的帮助。

height4plot1 <- c(1,6,9,2,3,10,7,15)
names4plot1 <- c("P1","P2","P3","P4","P5","P6","P7","P8")

height4plot2 <- c(5,4,10,2)
names4plot2 <- c("M1","M2","M3","M4")

height4plot3 <- c(4,12)
names4plot3 <0 c("U1","U2")

par(mfrow=c(1,3),
    mar=c(10,5,2,1),
    cex.axis=0.7,
    mgp=c(3,0.5,0))
barplot(height4plot1,
    names.arg=names4plot1,
    las=3,
    axes=TRUE,
    axisnames=TRUE,
    ylab="YLAB",
    ylim=ylim,
    plot=TRUE,
    main="PLOT1",
    width=1)
barplot(height4plot2,
    names.arg=names4plot2,
    las=3,
    axes=TRUE,
    axisnames=TRUE,
    ylim=ylim,
    plot=TRUE,
    main="PLOT2",
    width=1)
barplot(height4plot3,
    names.arg=names4plot3,
    las=3,
    axes=TRUE,
    axisnames=TRUE,
    ylim=ylim,
    plot=TRUE,
    main="PLOT3",
    width=1)

【问题讨论】:

    标签: r plot width


    【解决方案1】:

    如果没有height4plot1 等变量,就很难测试您的代码和修改,但这里有一些可能性:

    您可以为每个图指定width=0.8xlim=c(0,maxnum),其中 maxnum 是不同图中的最大条数。这将在每个较小的条形图中留下一个空白部分。

    您可以用NA 填充较短的高度向量,直到它们的长度相同(这仍然会给出空白部分)。

    您可以将 3 个向量连接在一起并制作一个箱线图,可能对 3 个组进行不同的着色以帮助区分它们。 abline 函数可用于在组之间添加分隔线(请参阅 barplot 的 space 参数,或包含“NA”作为分隔线以在组之间提供更多空间)。您可以使用返回值来帮助将标题放置在每个组之上。

    您可以使用layout 而不是par 将您的 3 个绘图区域设置为具有不同的宽度,但是要获得精确的宽度比率以提供完全相同大小的条形图并不简单(您可能会接近虽然反复试验)。如果您真的想要这条路线,那么grconvertXoptim 可能会有所帮助。

    我会建议上面的第二个选项。

    【讨论】:

    • 感谢您的建议格雷格。我试图将“NA”作为三组数据之间的分隔符,但我收到一条错误消息,提示条形的“高度”不是向量或矩阵。
    • 连接三个向量有效,abline 很有帮助。现在我只需要弄清楚如何在每个组上方添加额外的标题并对组进行颜色编码。
    【解决方案2】:

    我用我的替换了您不可复制的示例,并且似乎有效。 barplot 的 xlim 参数是一个整数值,范围从 1 到组数:

    tN <- table(Ni <- stats::rpois(100, lambda=5))
    opar <- par(mfrow=c(1,3),
        mar=c(10,5,2,1),
        cex.axis=0.7,
        mgp=c(3,0.5,0))
    barplot(tN[1:3],
       xlim=c(1, length(tN) ), 
        las=3,
        axes=TRUE,
        axisnames=TRUE,
        ylab="YLAB",
        plot=TRUE,
        main="PLOT1",
        width=1)
    barplot(tN[1:4],
       xlim=c(1, length(tN) ), 
        las=3,
        axes=TRUE,
        axisnames=TRUE,
        plot=TRUE,
        main="PLOT2",
        width=1)
    barplot(tN[1:5],
       xlim=c(1, length(tN) ), 
        las=3,
        axes=TRUE,
        axisnames=TRUE,
        plot=TRUE,
        main="PLOT3",
        width=1)    
    par(opar)
    

    【讨论】:

    • 感谢 DWin 的建议。我试过这样做,条形最终的宽度相同,但是三个地块都被压得很窄,它们之间有很大的空间。