5

ループでいくつかの棒グラフを生成しますが、それらはすべて、棒のサイズではなく、出力サイズ (プロット/デバイスのサイズから推測しますか?) に従ってサイズ変更されます。これは、棒が 2 本あるプロットには太い棒があり、棒が 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 では、バーのサイズを明示的に (相対的にではなく) 指定すると、それに応じて出力のサイズが変更されます。

4

1 に答える 1

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ループ コードを使用するには、少し開発する必要があります。それが役に立てば幸い。

于 2015-03-10T14:26:49.497 に答える