22

棒グラフでカテゴリを (再) 並べ替える方法について、多くの質問 (多くの場合、 ggplot2 bar graph の Order Bars にリンクされています) を見てきました。

私が求めているのはほんの少し違うだけですが、それを行う良い方法が見つかりませんでした.多面的な棒グラフがあり、別の変数に従って、各面のx軸を個別に並べたい(私の場合、その変数は y 値そのものです。つまり、各ファセットでバーの長さが増加するようにしたいだけです)。

ggplot2棒グラフのOrder Barsなどの簡単な例:

df <- data.frame(name=c('foo','bar','foo','bar'),period=c('old','old','recent','recent'),val=c(1.23,2.17,4.15,3.65))
p = ggplot(data = df, aes(x = reorder(name, val), y = val))
p = p + geom_bar(stat='identity')
p = p + facet_grid(~period)
p

得られるものは次のとおりです。 ここに画像の説明を入力

私が欲しいのは: ここに画像の説明を入力

4

4 に答える 4

24

さて、すべての哲学はさておき、誰かが興味を持っている場合に備えて、これを行うための醜いハックを次に示します。アイデアは、異なるラベルを使用することです(paste(period, name)表示されないように、ピリオドを0スペース、1スペースなどに置き換えることを除いて考えてください)。私はこのプロットが必要ですが、共通の伝説などを共有したいかもしれないので、グロブなどを配置したくありません.

前述のアトミックな例は次のようになります。

df <- data.frame(name=c('foo','bar','foo','bar'),
  period=c('old','old','recent','recent'),
  val=c(1.23,2.17,4.15,3.65),
  stringsAsFactors=F)
df$n = as.numeric(factor(df$period))
df = ddply(df,.(period,name),transform, x=paste(c(rep(' ',n-1), name), collapse=''))
df$x = factor(df$x, levels=df[order(df$val), 'x'])
p = ggplot(data = df, aes(x = x, y = val))
p = p + geom_bar(stat='identity')
p = p + facet_grid(~period, scale='free_x')
p

ここに画像の説明を入力 別の例は、まだ少しばかげていますが、私の実際の使用例に近いものです。

df <- ddply(mpg, .(year, manufacturer), summarize, mixmpg = mean(cty+hwy))
df$manufacturer = as.character(df$manufacturer)
df$n = as.numeric(factor(df$year))
df = ddply(df, .(year,manufacturer), transform,
     x=paste(c(rep(' ',n-1), manufacturer), collapse=''))
df$x = factor(df$x, levels=df[order(df$mixmpg), 'x'])
p = ggplot(data = df, aes(x = x, y = mixmpg))
p = p + geom_bar(stat='identity')
p = p + facet_grid(~year, scale='free_x')
p = p + theme(axis.text.x=element_text(angle=90,hjust=1,vjust=.5,colour='gray50'))
p

ここに画像の説明を入力 目を閉じて帝国のことを考え、楽しんでみてください。

于 2013-09-05T00:06:11.157 に答える