自动调整水平条形图中的边距

时间:2012-05-08 00:00:59

标签: r labels margins string-length

我需要制作一系列水平分组条形图。条形图功能不会自动调整图表的边距,因此文本会被截断。

  graphics.off()      # close graphics windows
   test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
                  nrow =3 , 
               ncol=4, 
               byrow=TRUE,
               dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"),
                               c(
                                 "Category 1 Long text",
                                 "Category 2 very Long text",
                                 "Category 3 short text",
                                 "Category 4 very short text"
                                 )))
  barplot(test, 
       las=2,
       beside = TRUE,
       legend=T,
       horiz=T)

enter image description here

我找不到一个选项来自动向右移动绘图,就像R点图功能一样((SAS中的条形图程序也会自动调整边距)。显然,我总是可以手动调整边距使用par函数。

  par(mar=c(5.1, 13 ,4.1 ,2.1))

将图表移到右侧

enter image description here

是否可以根据文本的长度自动将图表向右移动(即调整边距)?

我可以想到2个相关的appproaches以编程方式执行: 1)计算最长文本字符串的长度,并相应地调整左边距 2)为数据创建一个点图,以某种方式捕获边距并在条形图中使用相同的边距。

有更简单的方法吗? 谢谢!

1 个答案:

答案 0 :(得分:11)

我认为你的第一个想法可能是最合适的。像这样的东西似乎工作正常,并且不需要太多填充。

ylabels <-  c(  "1oooooooooooo",
            "2",
            "3",
            "4"
)

test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20), 
                  nrow =3 , 
               ncol=4, 
               byrow=TRUE,
               dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"),
                               ylabels))

# adjust to the maximum of either the default 
# or a figure based on the maximum length
par(mar=c(5.1, max(4.1,max(nchar(ylabels))/1.8) ,4.1 ,2.1))

barplot(test, 
       las=2,
       beside = TRUE,
       legend=T,
       horiz=T)

在检查dotchart之后,还可以使用更通用的解决方案:

linch <-  max(strwidth(ylabels, "inch")+0.4, na.rm = TRUE)
par(mai=c(1.02,linch,0.82,0.42))