我想用ggplot创建一个特定的条形图。到目前为止,这是我迄今为止所做的:
ggplot(only_savings, aes(DivisionName, Total_CR)) +
geom_bar(stat="summary", fun.y="sum")
如您所见 - 有两个部门:电气化产品和电力研磨。在Y轴上,我们总结了数字节省(Total_CR - 总成本降低)。但是,我想在另外两个部分拆分Bar:Repetitive_Savings和MDF_Savings。所以它看起来像这样:
以下是数据: (好吧,我无法发布截图,所以我会粘贴一些行)
DivisionName Repetitive_Savings MDF_Savings Total_CR
Power Grids 86.571656 0 86.571656
Power Grids 183.461221 0 183.461221
Power Grids 2326.963118 0 2326.963118
Electrification Products 1249.323277 0 1249.323277
Electrification Products 6.849336 0 6.849336
Electrification Products 3.808845 0 3.808846
DivisionName是一个因子,另外3个是数值。我怎样才能实现我在油漆中描绘的条形码?
答案 0 :(得分:0)
我稍微改变了你的例子,因为0的值不会为我们显示任何东西。
only_savings <- read.table(header = TRUE, text = "
DivisionName Repetitive_Savings MDF_Savings Total_CR
'Power Grids' 86.571656 500 86.571656
'Power Grids' 183.461221 500 183.461221
'Power Grids' 2326.963118 500 2326.963118
'Electrification Products' 1249.323277 500 1249.323277
'Electrification Products' 6.849336 500 6.849336
'Electrification Products' 3.808845 500 3.808846
")
ggplot
要求事物为长形式或“整齐”形式,这意味着每个观察应该是单独的行,另外一列告诉使用该行是属于重复还是MDF。一种简单的方法是使用tidyr
包。
我们必须使用Total过滤掉所有行,因为它们不需要绘制。
library(tidyr)
pd <- gather(only_savings, 'key', 'value', -DivisionName)
pd <- pd[pd$key != 'Total_CR', ]
现在剩下要做的就是为key
指定填充颜色。
library(ggplot2)
ggplot(pd, aes(DivisionName, value, fill = key)) +
geom_bar(stat = "summary", fun.y = "sum")
请注意,我们也可以按如下方式编写,其中观察的堆叠与首先对它们求和相同。
ggplot(pd, aes(DivisionName, value, fill = key)) +
geom_bar(stat = "identity")
答案 1 :(得分:0)
您要做的是引入一个分类参数,其中两个字段Repetitive_Savings
和MDF_Savings
是组。
因此,您的数据格式不正确。
您可以使用
重新格式化test.df<- diamonds[1:100,]
test.df <- test.df[,c(2,5,6)]
test.df$total <-test.df[,2]+test.df[,3]
head(test.df)
cut depth table total
1 Ideal 61.5 55 116.5
2 Premium 59.8 61 120.8
3 Good 56.9 65 121.9
4 Premium 62.4 58 120.4
5 Good 63.3 58 121.3
6 Very Good 62.8 57 119.8
Colnames<-colnames(test.df)
NewData.list<-lapply(1:nrow(test.df),function(x){
Row<-test.df[x,]
data.frame(DivisionName=Row[,1],Values=c(Row[,2],Row[,3],Row[,4]),Categories=Colnames[c(2,3,4)])
})
NewData.df <- do.call(rbind,NewData.list)
DivisionName Values Categories
1 Ideal 61.5 depth
2 Ideal 55.0 table
3 Ideal 116.5 total
4 Premium 59.8 depth
5 Premium 61.0 table
6 Premium 120.8 total
然后绘制
NewData.df$Categories<- factor(NewData.df$Categories,levels=unique(NewData.df$Categories))
NewData.df <- NewData.df[order(NewData.df$Categories),]
Plot<-ggplot(NewData.df, aes(x=DivisionName, y=Values,group=Categories)) + geom_bar(stat="identity",aes(fill=Categories),colour="#000000")
ggsave(file="Test.png",Plot)