我是R的新手,我正试图获得叠加的条形图。我的数据如下:
name value1 value2
1 A 1118 239
2 B 647 31
3 C 316 1275
4 D 2064 230
5 E 231 85
我需要一个带有堆叠值的水平条形图,这是我可以通过我有限的R技能得到的(大部分都是复制粘贴):
melted <- melt(data, id.vars=c("name"))
melted$name <- factor(
melted$name,
levels=rev(sort(unique(melted$name))),
ordered=TRUE
)
melted2 <- melted[order(melted$value),]
ggplot(melted2, aes(x= name, y = value, fill = variable)) +
geom_bar(stat = "identity") +
coord_flip()
甚至花了我几个小时来达到这一点,女巫我看起来很满意,这就是产生的输出
我现在要做的是按总和值排序条形(D先是,然后是C,A,B,E)。我用谷歌搜索并尝试了一些reorder
和order
的东西,但我根本无法让它表现得像我想要的那样。我确信解决方案必须非常简单,所以我希望你们可以帮助我。
提前致谢!
答案 0 :(得分:1)
好吧,我没有关注或跟上ggplot中的所有最新变化,但是这里有一种方法可以解决这个问题
我使用您的想法设置name
的因子级别,但是基于分组的总和。您可能还会发现order = variable
在某些时候很有用,它会根据变量对条形颜色进行排序,但这里不需要
data <- read.table(header = TRUE, text = "name value1 value2
1 A 1118 239
2 B 647 31
3 C 316 1275
4 D 2064 230
5 E 231 85")
library('reshape2')
library('ggplot2')
melted <- melt(data, id.vars=c("name"))
melted <- within(melted, {
name <- factor(name, levels = names(sort(tapply(value, name, sum))))
})
levels(melted$name)
# [1] "E" "B" "A" "C" "D"
ggplot(melted, aes(x= name, y = value, fill = variable, order = variable)) +
geom_bar(stat = "identity") +
coord_flip()
答案 1 :(得分:1)
另一种选择是使用dplyr
包在数据框中设置总列并使用它进行排序。
方法看起来像这样。
m <- melted %>% group_by(name) %>%
mutate(total = sum(value) ) %>%
ungroup() %>%
arrange(total) %>%
mutate(name = factor(name, levels = unique(as.character(name))) )
ggplot(m, aes(x = name, y = value, fill = variable)) + geom_bar(stat = 'identity') + coord_flip()
答案 2 :(得分:0)
请注意尝试以下代码。
使用tidyr
包代替reshape2
包
library(ggplot2)
library(dplyr)
library(tidyr)
data <- read.table(text = "
class value1 value2
A 1118 239
B 647 31
C 316 1275
D 2064 230
E 231 85", header = TRUE)
pd <- gather(data, key, value, -class) %>%
mutate(class = factor(class, levels = tapply(value, class, sum) %>% sort %>% names))
pd %>% ggplot(aes(x = class, y = value, fill = key, order = class)) +
geom_bar(stat = "identity") +
coord_flip()