2016-04-07 3 views
0

Я хотел бы построить график сложенной штриховкой (или график стрелки), предпочтительно используя ggplot2, с приведенными ниже данными d, для каждого id.уложенная гистограмма с некоторыми отрицательными значениями и упорядоченными категориями

Особенностью является то, что я хотел для стека, чтобы следовать столбцы заказать v0 первый, второй, z1 и z2 третий (данные представлены в широком формате). Однако обратите внимание, что z2 имеет некоторые отрицательные значения. Поэтому он должен каким-то образом быть представлен стрелкой или чем-то, сверху вниз стека (или вверх, в зависимости от значения z3).

Есть ли способ сделать это?

d <- data.frame(
    id=c('AAA','BBB','CCC','DDD','EEE','FFF'), 
    v0 =c(50 , 60 , 40 , 50 , 70 ,40), 
    z1 =c(20 , 15 , 5 , 40 , 5 , 40), 
    z2 =c(-10 , 5 , 10 ,-20 , 15 ,-15) 
) 

#normaly people transform the data to long format: 
d %>% gather(ef_type, value,v0:d2) %>% 
    ggplot(aes(...) + geom_bar(...) 

OBS: Обратите внимание, что это отличается от ответа на this related question, в котором порядок столбцов не имеет значения, а отрицательные значения представлены в отрицательной части оси у.

EDIT1: на основе @fanli ответ ниже, я попытался следующий код:

d %>% select(id,v0,z1) %>% gather(ef_type, value,v0:z1) -> df 
d %>% mutate(z2_start=v0+z1,z2_end=v0+z1+z2) %>% select(id,z2_start,z2_end) -> df2 

ggplot(df, aes(x=id,y=value,fill=ef_type))+ geom_bar(stat = "identity") + 
    + geom_segment(data=df2, aes(x=id, xend=id, y=z2_start, yend=z2_end), arrow = arrow(length = unit(0.02, "npc"))) 

#which results in the error: 
Error: ggplot2 doesn't know how to deal with data of class uneval 

ответ

4

Вы ищете что-то вроде этого?

df <- melt(d) 
df$absvalue <- abs(df$value) 
df <- ddply(df, .(id), transform, pos = 
    ifelse(value<0, cumsum(absvalue)-(0.4 * absvalue), 
    cumsum(absvalue)-(0.6 * absvalue))) 
df <- ddply(df, .(id), transform, pos2 = 
    ifelse(value>0, cumsum(absvalue)-(0.4 * absvalue), 
    cumsum(absvalue)-(0.6 * absvalue))) 
ggplot(df, aes(x=id,y=absvalue,group=variable,fill=variable)) 
    + geom_bar(stat="identity", position="stack") 
    + geom_segment(aes(x=id, xend=id, y=pos, yend=pos2), arrow = arrow(length = unit(0.02, "npc"))) 

enter image description here

Вы можете играть с позиции/количество/размер стрелок, но geom_segment кажется, один из возможных вариантов для того, что вы хотите.

Edit: На основе уточнения желаемых результатов:

ДФ < - расплав (d)

ggplot(subset(df, variable!="z2"), aes(x=id,y=value,group=variable,fill=variable)) 
+ geom_bar(stat="identity", position="stack") + geom_segment(data=d, 
    aes(x=id, xend=id, y=v0+z1, yend=v0+z1+z2), arrow = arrow(length = unit(0.02, "npc")), inherit.aes=F) 

enter image description here

Edit 2: Используйте scale_fill_manual и scale_color_manual настроить ключи легенды:

d <- data.frame(
    id=c('AAA','BBB','CCC','DDD','EEE','FFF'), 
    v0 =c(50 , 60 , 40 , 50 , 70 ,40), 
    z1 =c(20 , 15 , 5 , 40 , 5 , 40), 
    z2 =c(-10 , 5 , 10 ,-20 , 15 ,-15) 
) 
d$cc <- "effect B" 
df <- melt(d) 
ggplot(subset(df, variable!="z2"), aes(x=id,y=value,group=variable,fill=variable)) + geom_bar(stat="identity", position="stack") + geom_segment(data=d, aes(x=id, xend=id, y=v0+z1, yend=v0+z1+z2, color=cc), arrow = arrow(length = unit(0.02, "npc")), inherit.aes=F) + scale_color_manual(values="black") + scale_fill_manual(values=c("skyblue", "red"), labels=c("base level", "effect A")) 
+0

круто. Это более или менее то, что я хочу. Cathegory z2 не должен отображаться в виде полосы, только как стрелка, начиная с «v0 + z1» и заканчивая на «v0 + z1-z2» – LucasMation

+0

Это замечательно! Единственная проблема, остающаяся с этой диаграммой, заключается в том, что было бы неплохо присвоить легенду некоторую ценность. Допустим, что метки - v0: «базовый уровень»; z1: «эффект A»; z2 (стрелка) «эффект B». Может ли это включить в легенду? – LucasMation

+0

вы используете reshape2 :: расплавить? Я попытался воспроизвести код на своем компьютере, но я получаю сообщение об ошибке: Ошибка в + geom_bar (stat = "identity", position = "stack"): Недопустимый аргумент для унарного оператора – LucasMation

Смежные вопросы