2017-08-02 360 views
0

我有以下數據:添加額外的價值ggplot barplot

Sp Type Val1 Val2 
A One  200  50 
A Two  100  10 
C One  300  150 
C Two  200  10 

我做了如下得到堆疊barplot:

ggplot() + 
    geom_bar(data=test, aes(y = Val1, x = Sp, fill = Type), stat="identity",position='stack') 

因此,我得到兩個堆疊的酒吧爲A,B各堆疊的1型& 2(A的總尺寸是200 + 100 = 300)。這裏,val2是每個類型中未知數的一小部分。我如何覆蓋堆棧的各個部分?即在Val1中的A型中,未知的部分是Val2。

在此先感謝。

AP

+0

請更精確。你想在Val1上面疊加Val2嗎?或者你想要一個包含兩個值的堆疊barplot? – Jimbou

+0

它是Val2陰影的堆疊式barplot。我的意思是我想在Val1酒吧裏添加Val2。即A將會有2個堆棧,1個有200個,2個有100個。在200個堆棧中,我想用50個和100個區域來遮蔽10個區域。如果我們有50和10個相同的顏色,它看起來就像兩個堆棧中標記的比例! – Arun

+0

好的,然後看看我的答案!其他人只是總結Val1和Val2。 – Jimbou

回答

1

你可以試試:

d$xmin <- rep(c(0.55, 1.55),each=2) 
d$xmax <- rep(c(1.45, 2.45),each=2) 
d$ymin <- c(100, 0, 200, 0) 
d$ymax <- c(150, 10, 350, 10) 

ggplot(d) + 
    geom_col(aes(x=Sp, y=Val1, fill=Type)) + 
    geom_rect(aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), alpha=0.5) 

的想法是在酒吧手動添加矩形(我在這裏使用geom_col因爲此功能默認使用stat_identity)。因此,您可以自己計算分鐘數和最大值,並添加一些阿爾法來重新繪製條形圖。

或者你可以嘗試更自動化的解決方案dplyr

library(tidyverse) 
d %>% 
    arrange(Sp, -as.numeric(Type)) %>% 
    mutate(ymin=ifelse(Type=="One",lag(Val1),0), 
     ymax=ifelse(Type=="Two",Val2, lag(Val1)+Val2)) %>% 
    mutate(Sp_n=as.numeric(Sp)) %>% 
    ggplot() + 
    geom_col(aes(x=Sp_n, y=Val1, fill=Type))+ 
    geom_rect(aes(xmin=Sp_n-0.45, xmax=Sp_n+0.45, ymin=ymin, ymax=ymax), 
    fill="white", alpha= 0.7) + 
    scale_x_continuous(breaks = 1:2, labels = unique(d$Sp)) 

enter image description here

2

這就是你正在尋找?:

library(ggplot2) 
data <- data.frame(Sp = c("A","A","C","C"), 
        Type = c("one","two","one","two"), 
        Val1 = c(200,100,300,200), 
        Val2 = c(50,10,150,10)) 
library(reshape2) 
data <- melt(data, id=c("Sp","Type")) 
data$Type2 <- paste(data$Type, data$variable, sep="_") 

[更新] 你熔化後得到的數據:

Sp Type variable value Type2 
1 A one  Val1 200 one_Val1 # it has value of 200 for Sp A 
2 A two  Val1 100 two_Val1 # it has value of 100 for Sp A 
3 C one  Val1 300 one_Val1 
4 C two  Val1 200 two_Val1 
5 A one  Val2 50 one_Val2 
6 A two  Val2 10 two_Val2 
7 C one  Val2 150 one_Val2 
8 C two  Val2 10 two_Val2 

one_Val1等於和two_Val1至 - > 200 + 100 = 300

ggplot() + 
    geom_bar(data=data, aes(y = value, x = Sp, fill = Type2), stat="identity",position='stack') 

enter image description here

我在第一數據已被熔化以得到在一列VAL1和val2的值,以進一步使用它,並將它與類型列粘貼在一起。

+0

對於您的解決方案,A的總大小不會達到300(200 + 100)。 – Jimbou

+0

one_Val1 and two_Val1 = 300 - >這是類型1的Sp:A –

+0

沒有一個是不正確的。 – Jimbou

1

如果你想讓它每VAL1/VAL2分值

library(ggplot2) 
library(reshape2) 
test <- melt(test, id=c("Sp","Type")) 
ggplot(data=test) + 
    geom_bar(aes(y = value, x = Sp, fill = Type), stat="identity",position='stack')+ 
    facet_wrap(~variable)