Автоматически изменять размер столбцов в ggplot для единообразия на нескольких графиках R

Я генерирую несколько гистограмм в цикле, и все они меняют размер в соответствии с размером вывода (предположим, исходя из размера графика / устройства?), А не в соответствии с размером столбца. Это означает, что графики с двумя полосами имеют жирные полосы, а графики, скажем, с 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 я бы указал размер полосы явно (т.е. не относительно), и размер вывода изменился бы соответствующим образом.


person Alex    schedule 10.03.2015    source источник


Ответы (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 код цикла, необходимо немного доработать. Надеюсь, это поможет.

person Nicolabo    schedule 10.03.2015