web-dev-qa-db-ja.com

ggplotのファセットの順序を修正する

データ:

type    size    amount  
T   50%     48.4    
F   50%     48.1    
P   50%     46.8    
T   100%    25.9    
F   100%    26.0    
P   100%    24.9    
T   150%    21.1    
F   150%    21.4    
P   150%    20.1    
T   200%    20.8    
F   200%    21.5    
P   200%    16.5

Ggplot(x-axis-> "type"、y-axis-> "amount"、group by "size")を使用して、上記のデータの棒グラフをプロットする必要があります。次のコードを使用したとき、データに示されている順序で変数「type」と「size」を取得していません。図をご覧ください。そのために次のコードを使用しました。

 ggplot(temp, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_bar(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

enter image description here 。

順序の問題を修正するために、次を使用して変数「type」にファクターメソッドを使用しました。図もご覧ください。

temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P")) 

enter image description here

しかし、変数「サイズ」の順序を修正する方法がわかりません。 50%、100%でなければなりません。 150%、200%。

64
samarasa

次の方法で、データフレームのサイズを要因にします。

_temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))
_

次に、facet_grid(.~size)facet_grid(.~size_f)に変更します

次にプロットする: enter image description here

グラフは正しい順序になりました。

99
Harpal

これは、dplyrパイプチェーン内に物事を保持するソリューションです。データを事前に並べ替えてから、mutate_atを使用して係数に変換します。合理的にソートできるデータを前提として、このソリューションを一般的に適用する方法を示すために、データを少し変更しました。

# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
                    size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
                    size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
                    amount=c(48.4, 48.1, 46.8, 
                             25.9, 26.0, 24.9,
                             20.8, 21.5, 16.5,
                             21.1, 21.4, 20.1))

temp %>% 
  arrange(size_num) %>% # sort
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor

  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

このソリューションを適用して、ファセット内にバーを配置することもできますが、選択できる優先順序は1つだけです。

    temp %>% 
  arrange(size_num) %>%
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
  arrange(desc(amount)) %>%
  mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)


  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)
1
tim.farkas