2017-11-30 26 views
2

によってのは、私は例のデータフレームを持っているとしましょう:並べ替えggplot barplot x軸facet_wrap

frame <- 
    data.frame(group = c(rep(1, 3), rep(2, 3)), 
       idea = c(1, 2, 3, 1, 2, 4), 
       value = c(10000, 5000, 50, 5000, 7500, 100), 
       level = sample(c("rough", "detailed"), 6, TRUE)) 

私はそれが価値だが注文したグループ内の各アイデアを価値のbarplotをしたいと思います。私は上記のtop_ideasデータフレームではその順序に従って、因子レベルを設定して、最終的なdplyrラインでこの

library(dplyr) 
library(ggplot2) 

top_ideas <- 
    frame %>% 
    group_by(group) %>% 
    arrange(group, desc(value)) 

frame %>%  
    group_by(group) %>% 
    mutate(idea = idea %>% factor(levels = top_ideas$idea)) %>% 
    ggplot(aes_string(x = "idea", y = "value", fill = "level")) + 
    geom_bar(stat = "identity") + 
    theme(legend.position = "bottom", 
      axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + 
    facet_wrap(~group, scales = "free") 

のmutateなどの近くに取得することができます。残念ながら、アイデアの番号1と2はグループ1と2の両方で共有されているため、順序は最初のグループによって設定されます。私がしたいのですがどのような

enter image description here

は、各グループの独立した両端面でのアイデアの順序です。 dplyr文字列でどうすればいいですか?私は何か簡単なものを逃しています

これはサンプルデータであることに注意してください。実際のデータははるかに大きく、共有されるグループやアイデアが多く含まれています。ここで

答えて

2

は、回避策です:

データ:

# setting seed to make solution reproducible 
set.seed(123) 
frame <- 
    data.frame(group = c(rep(1, 3), rep(2, 3)), 
      idea = c(1, 2, 3, 1, 2, 4), 
      value = c(10000, 5000, 50, 5000, 7500, 100), 
      level = sample(c("rough", "detailed"), 6, TRUE)) 

コード:

library(dplyr) 
library(tidyr) 
library(ggplot2) 

top_ideas <- 
    frame %>% 
    group_by(group) %>% 
    arrange(group, desc(value)) %>% 
    unite("grp_idea", group, idea, sep = "_", remove = FALSE) %>% 
    data.frame() %>% 
    mutate(grp_idea = factor(grp_idea, levels = grp_idea)) 

top_ideas %>%  
    group_by(group) %>% 
    ggplot(aes(x = grp_idea, y = value, fill = level)) + 
    geom_bar(stat = "identity") + 
    theme(legend.position = "bottom", 
     axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + 
    facet_wrap(~group, scales = "free") + 
    xlab("idea") + 
    scale_x_discrete(breaks = top_ideas$grp_idea, 
        labels = top_ideas$idea) 

結果:

> top_ideas 
    grp_idea group idea value level 
1  1_1  1 1 10000 rough 
2  1_2  1 2 5000 detailed 
3  1_3  1 3 50 rough 
4  2_2  2 2 7500 detailed 
5  2_1  2 1 5000 detailed 
6  2_4  2 4 100 rough 

enter image description here

注:

は基本的に私がやっている、一緒にgroupidea変数を貼り付け所望のレベルでの要因に新しい変数grp_ideaを変換し、としてそれを使用することです元のidea列の代わりにx軸を使用します。これにより、各ファセットのレベルの順序付けは、同じレベルを共有しないため、他のファセットの影響を受けないようになります。 x軸のタイトルと目盛りラベルのラベルを変更するには、xlabscale_x_discreteで十分です。

+1

良い、簡単な回避策。また、私を「団結して」紹介してくれてありがとう! – Steven

+0

@Steven Opps、私は 'library(tidyr)'を追加するのを忘れました。 「団結」は「整頓」からのものです。また、 'separate'と' extract'をチェックして、列を2つ以上の列に分離します。 – useR

+0

問題ありません。私はちょうど '団結して'それは 'tidyr'から見た。しかし、他のfxのヒントをありがとう。それは助けになるでしょう。 – Steven

関連する問題