我在循环中生成几个条形图,它们都根据输出大小(从绘图/设备大小假设?)而不是根据条形大小调整大小。这意味着具有两个条形图的图具有粗条形图,而具有 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 和 R 的新手。我来自 MATLAB,所以整个“设备”的事情仍然让我感到困惑!在 MATLAB 中,我会明确指定条形大小(即不是相对的),并且输出会相应地调整大小。
你可以用这个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
package
foo(mtcars,cyl)
也有效。此代码的一个缺点是仅使用列的确切名称。所以为了使用for
循环代码必须稍微开发一下。希望能帮助到你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)