R Barplot与ggplot2 - 两个不同的数字类别!值

时间:2016-08-19 11:33:43

标签: r ggplot2 bar-chart

我想用ggplot创建一个特定的条形图。到目前为止,这是我迄今为止所做的:

ggplot(only_savings, aes(DivisionName,  Total_CR)) +
geom_bar(stat="summary", fun.y="sum")

Total_CR on Y with 1 bar

如您所见 - 有两个部门:电气化产品和电力研磨。在Y轴上,我们总结了数字节省(Total_CR - 总成本降低)。但是,我想在另外两个部分拆分Bar:Repetitive_Savings和MDF_Savings。所以它看起来像这样:

Total_CR on Y with divided Bars

以下是数据: (好吧,我无法发布截图,所以我会粘贴一些行)

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个是数值。我怎样才能实现我在油漆中描绘的条形码?

2 个答案:

答案 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")

结果

this site

答案 1 :(得分:0)

您要做的是引入一个分类参数,其中两个字段Repetitive_SavingsMDF_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)

enter image description here