Я хотел бы построить график сложенной штриховкой (или график стрелки), предпочтительно используя 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
круто. Это более или менее то, что я хочу. Cathegory z2 не должен отображаться в виде полосы, только как стрелка, начиная с «v0 + z1» и заканчивая на «v0 + z1-z2» – LucasMation
Это замечательно! Единственная проблема, остающаяся с этой диаграммой, заключается в том, что было бы неплохо присвоить легенду некоторую ценность. Допустим, что метки - v0: «базовый уровень»; z1: «эффект A»; z2 (стрелка) «эффект B». Может ли это включить в легенду? – LucasMation
вы используете reshape2 :: расплавить? Я попытался воспроизвести код на своем компьютере, но я получаю сообщение об ошибке: Ошибка в + geom_bar (stat = "identity", position = "stack"): Недопустимый аргумент для унарного оператора – LucasMation