在ggplot中自动调整条形大小,以便在几个图形R上保持一致性

时间:2015-03-10 04:56:42

标签: r ggplot2 size width geom-bar

我在一个循环中生成几个条形图,它们都根据输出大小(假设从图/设备大小?)而不是根据条形大小调整大小。这意味着有两个条形的地块有脂肪条,比如说有6个条形的地块有薄条;两个输出都是相同的大小。下面的代码表示我的脚本具有可重现的数据(我做了很多其他的aes /主题更改)。

我希望输出图调整大小(在条宽度的维度上),以便条形在不同图形上始终具有相同的宽度,但输出图像会根据(相同宽度)条的数量改变大小。

my_factors = c("vs","cyl","carb")

for (current_factor in my_factors) {
    c <- ggplot(mtcars, aes(factor(current_factor)))
    c + geom_bar() + coord_flip()

    ggsave(paste0(my_factors(current_factor),".png")
}

对不起,如果我错过了一些明显的东西,我是ggplot的新手,而且我是MATLAB的,所以整个“设备”的东西仍然让我感到困惑!在MATLAB中,我明确指定了条形大小(即不相对),输出会相应地调整大小。

1 个答案:

答案 0 :(得分:0)

您可以使用此foo功能

library(lazyeval)
library(ggplot2)
foo <- function(data,i, height_rate = 0.1){
  height <- eval(substitute(length(unique(data$i))))
  ld <- as.lazy_dots(list(lazy(i))) 
  ld <- as.lazy_dots(lapply(ld, function(x){ 
    try(x$expr <- as.name(x$expr), silent=TRUE)
    x
  }))
  x <- make_call(quote(aes),make_call(quote(factor),ld))
  ggplot(data, eval(x$expr))+
    geom_bar(width = height_rate*height)+
    coord_flip()
}

foo(mtcars,"cyl")

由于lazyeval

foo(mtcars,cyl)

也有效。此代码的缺点是仅使用列的确切名称。因此,为了使用for,必须开发一些循环代码。希望它有所帮助。