我有数据:
类似的东西:
name year Var1 Var2 Var3
A 1 0.67 0.97 0.75
A 2 0.19 0.89 0.63
A 3 0.07 0.30 0.95
B 1 0.05 0.66 0.94
B 2 0.43 0.27 0.51
B 3 0.63 0.42 0.13
C 1 0.03 0.26 0.18
C 2 0.70 0.24 0.09
C 3 0.06 0.83 0.03
D 1 0.40 0.16 0.27
D 2 0.10 0.80 0.17
D 3 0.57 0.10 0.78
E 1 0.07 0.66 0.63
E 2 0.00 0.02 0.90
E 3 0.91 0.54 0.17
我想做什么:
在x轴上带有变量“name”的堆积条形图。条形应代表所有可用年份的var1-3的平均值。最后,X轴应该排名,左边的堆叠条较低,右边的堆叠条较高。
它应该如何:
Average Var1 Var2 Var3 Total (var1-3)
A 0.31 0.72 0.78 1.81
B 0.37 0.45 0.53 1.35
C 0.26 0.44 0.10 0.81
D 0.36 0.35 0.41 1.12
E 0.33 0.41 0.57 1.30
我做了什么:
我认为这项任务意味着许多步骤,而且我已经过了一天半的混乱。
我尝试对数据进行排名,创建一个总变量[total = var1+ var2 + var3]
。我使用融合功能将数据从宽格式转换为长格式。
longdata <- melt(widedata, id.vars = c("name","year", "total")
尝试对其进行排名:
longdata <- transform(longdata, name = reorder(name, total))
并绘制它(悲惨地失败):
ggplot(longdata, aes(x=name, y=longdata$value, fill=factor(variable))) + geom_bar(stat="identity")
答案 0 :(得分:2)
您可以使用例如dplyr
包来汇总您的数据,然后对其进行重塑:
# reading the data
df <- read.table(text="name year Var1 Var2 Var3
A 1 0.67 0.97 0.75
A 2 0.19 0.89 0.63
A 3 0.07 0.30 0.95
B 1 0.05 0.66 0.94
B 2 0.43 0.27 0.51
B 3 0.63 0.42 0.13
C 1 0.03 0.26 0.18
C 2 0.70 0.24 0.09
C 3 0.06 0.83 0.03
D 1 0.40 0.16 0.27
D 2 0.10 0.80 0.17
D 3 0.57 0.10 0.78
E 1 0.07 0.66 0.63
E 2 0.00 0.02 0.90
E 3 0.91 0.54 0.17", header=TRUE)
# creating the 'Total' variable
df$Total <- rowSums(df[,3:5])
# summarising your data
require(dplyr)
newdf <- df %>%
group_by(name) %>%
summarise(var1=mean(Var1), var2=mean(Var2), var3=mean(Var3), tot=mean(Total))
# reordering according to 'tot' value
newdf <- transform(newdf, name = reorder(name, tot))
# from wide to long
melted <- melt(newdf, id="name")
# creating the plot
ggplot(melted, aes(x=name, y=value, fill=factor(variable))) +
geom_bar(stat="identity") +
theme_bw()
给出:
您还可以将条形图彼此相邻放置(这样您可以更好地将它们相互比较):
ggplot(melted, aes(x=name, y=value, fill=factor(variable))) +
geom_bar(stat="identity", position="dodge") +
theme_bw()
给出: