自动调整 ggplot 中条形图的大小,以实现多个图形 R 的一致性

Posted

技术标签:

【中文标题】自动调整 ggplot 中条形图的大小,以实现多个图形 R 的一致性【英文标题】:Automatically resize bars in ggplot for uniformity across several graphs R 【发布时间】:2015-05-11 11:04:22 【问题描述】:

我在一个循环中生成了几个条形图,它们都根据输出大小(假设从绘图/设备大小?)而不是根据条形大小调整大小。这意味着有两个条的地块有粗条,而有 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 中,我会明确指定条形大小(即不是相对的),并且输出会相应地调整大小。

【问题讨论】:

【参考方案1】:

你可以使用这个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 循环代码必须稍微开发一下。希望对您有所帮助。

【讨论】:

以上是关于自动调整 ggplot 中条形图的大小,以实现多个图形 R 的一致性的主要内容,如果未能解决你的问题,请参考以下文章

ChartJS中条形图的边框半径

ggplot geom_text 字体大小控制

技术贴 | R语言:手把手教你搞定ggplot柱形图

R语言可视化及作图6--ggplot2之点图、条形图、盒形图、直方图、线图

seaborn中条形图条和误差条的美学

怎么样使得柱状图的截断空白太大