我在创建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)
然后我使用gather
包中的tidyr
函数将data.frame从宽格式转换为长格式:
long.cheese.vit <- gather(Cheese_Vitamins, Vitamins, Percentage, c(A, B1, B2, B3, B5, B6, B9, B12,Ch, C, D, E))
然而,当我尝试绘制填充图表时:
ggplot(long.cheese.vit, aes(Cheese, fill = Percentage)) +
geom_bar(position = "fill")
我没有得到我想要的结果:
我想要创建的是一个填充的条形图,每个奶酪的维生素含量按百分比细分。 任何的意见都将会有帮助。 谢谢!
答案 0 :(得分:3)
每种维生素的价值是每维生素的每日价值百分比。因此,堆叠值或将其填充为100%的比例是不合适的。
一种选择是用维生素填充,但要避开酒吧。我使用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")
这没关系,但含有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 ~ .)
您可能还会考虑使用facet_grid(. ~ vitamin)
来反转切面,这会导致相当混乱的x轴标签,但会使维生素比较更容易。所以也许用奶酪填充并删除标签:
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())
答案 1 :(得分:1)