2017-06-15 13 views
0

position = "fill"グラフの作成に問題があり、どこが間違っていたのか不思議でした。私は、ウィキペディアのページから一部のデータを発見し、それからのデータフレームを作成しました:ggplot2 position = "fill"の問題

#Vitamin Contents in %DV of common cheeses per 100gm 
Cheese <- c("Swiss", "Feta", "Cheddar","Mozarella", "Cottage") 
A <- c(17, 8, 20, 14, 3) 
B1 <- c(4, 10, 2, 2, 2) 
B2 <- c(17, 50, 22, 17,10) 
B3 <- c(0,5,0,1,0) 
B5 <- c(4, 10, 4, 1, 6)Rplot 
B6 <- c(4, 21, 4, 2, 2) 
B9 <- c(1, 8, 5, 2, 3) 
B12 <- c(56, 28, 14, 38, 7) 
Ch <- c(2.8, 2.2, 3, 2.8, 3.3) 
C <- c(0, 0, 0, 0, 0) 
D <- c(11, 0, 3, 0, 0) 
E <- c(2, 1, 1, 1, 0) 

Cheese_Vitamins <- data.frame(Cheese, A, B1, B2, B3, B5, B6, B9, B12, Ch, C, D, E) 

私はその後、tidyr package`からgather機能を使用して長い形式に広いからdata.frameを変換:

long.cheese.vit <- gather(Cheese_Vitamins, Vitamins, Percentage, c(A, B1, B2, B3, B5, B6, B9, B12,Ch, C, D, E)) 

しかし、私は満たされたチャートグラフ化しようとすると:

01:

ggplot(long.cheese.vit, aes(Cheese, fill = Percentage)) + 
    geom_bar(position = "fill") 

を私は探しています結果を得ることはありません私が作成しようとしています何

Cheese Vitamin content

各チーズのための割合で分解ビタミン含有量で満たさ棒グラフです。 提案が役に立ちます。 ありがとうございました!

+1

小さな補正: '' 'tidyr'関数である)(ギャザーを。 – neilfws

+0

あなたのチーズグループのパーセンテージは100%になりません。 – ccapizzano

+0

@ccapizzanoは良い点を作っています。値はビタミン1日あたりの価値の百分率ですので、100%までの充填はここでは適切ではありません。 – neilfws

答えて

3

各ビタミンの値は毎日値のパーセンテージであります、1ビタミンあたり。したがって、値を積み重ねたり、100%の割合で塗りつぶしたりするのは適切ではありません。

1つの選択肢は、ビタミンで塗りつぶすが、バーをかわすことです。私は、ウィキペディアのテーブルから直接データをつかむためにrvestを使用しています:

library(rvest) 
library(tidyr) 
library(ggplot2) 

read_html("https://en.wikipedia.org/wiki/Cheese#Nutrition_and_health") %>% 
    html_node("#mw-content-text > div > table:nth-child(98)") %>% 
    html_table() %>% 
    gather(vitamin, percentage, -Cheese) %>% 
    ggplot(aes(Cheese, percentage)) + 
    geom_col(aes(fill = vitamin), position = "dodge") 

enter image description here

これはOKですが、13件のビタミンと、色が区別することが困難になります。より良い選択肢は、ビタミンのためにファセットを使用することかもしれません。

read_html("https://en.wikipedia.org/wiki/Cheese#Nutrition_and_health") %>% 
    html_node("#mw-content-text > div > table:nth-child(98)") %>% 
    html_table() %>% 
    gather(vitamin, percentage, -Cheese) %>% 
    ggplot(aes(Cheese, percentage)) + 
    geom_col() + 
    facet_grid(vitamin ~ .) 
あなたはまた、かなり雑然とx軸ラベルに結果が、ビタミン比較が容易になりますことを、 facet_grid(. ~ vitamin)を使用してファセットを逆転させる検討するかもしれない

enter image description here

。ので、おそらくチーズにより充填したラベルを削除:

read_html("https://en.wikipedia.org/wiki/Cheese#Nutrition_and_health") %>% 
    html_node("#mw-content-text > div > table:nth-child(98)") %>% 
    html_table() %>% 
    gather(vitamin, percentage, -Cheese) %>% 
    ggplot(aes(Cheese, percentage)) + 
    geom_col(aes(fill = Cheese)) + 
    facet_grid(. ~ vitamin) + 
    theme(axis.text.x = element_blank()) 

enter image description here

+0

これまでどんなrプロットでも最高の答えの一つです。 +1 – Masoud

+0

こんにちはNeil、私はあなたが私を助けることができるかどうか疑問に思っていたもう1つの質問がありますか?私はコードを使ってどのチーズが各ビタミンを最大限に使うかを決める方法を見つけようとしています。例えば、これらのグラフでは、スイスチーズが最もビタミンB12を提供していることがわかりますが、これをすべてのビタミンについて決定するためにコードを使用するにはどうすればよいですか? 私はあなたのブログの大ファンです。すべてのあなたの助けをありがとう – RunAmuck

+1

私は通常、新しい質問を投稿することをお勧めしますが、これは動作するはずです。 (ビタミン、チーズ)%>集計(v =最大(パーセンテージ))%>%フィルター(v =最大、パーセンテージ) = max(v)) 'となる。例えば、チーズにはビタミンCが含まれていないので、5つすべてが値= 0でリストされます。 – neilfws

1

Percentageの列をy値として正しく識別し、geom_barpositionではなく)のstat引数を使用する必要があります。私はより多くを知っていれば、私は私の答えを更新しますので、まだ、チーズグループあたりの割合を100%にならない...

ggplot(long.cheese.vit, aes(x=Cheese,y=Percentage,fill=Vitamins)) + geom_bar(stat="identity") 

enter image description here

関連する問題