J'ai les données suivantes:

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

J'ai fait ce qui suit pour obtenir un barplot empilé:

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

Par conséquent, j'obtiens deux barres empilées pour A, B chacune avec des piles de Type 1 et 2 (la taille totale de A est 200 + 100 = 300). Ici, val2 est une fraction d'inconnues dans chaque type. Comment le superposer dans les portions respectives de la pile? c'est-à-dire dans le type A de Val1, la fraction d'inconnu est Val2.

Merci d'avance.

AP

0
Arun 2 août 2017 à 11:28

2 réponses

Meilleure réponse

Tu peux essayer:

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) 

L'idée est d'ajouter manuellement des rectangles sur les barres (j'utilise ici geom_col car cette fonction utilise stat_identity par défaut). Ainsi, vous calculez les minutes et le maximum par vous-même et ajoutez un peu d'alpha pour surplotter les barres.

Ou vous pouvez essayer une solution dplyr plus automatique:

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

1
Roman 2 août 2017 à 09:51

Au cas où vous voudriez qu'il soit divisé par valeurs 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)
1
Patrik_P 2 août 2017 à 09:22