我想在R中绘制一个图表,该图表将向我显示构面中每种类型的垂直线。
df是X人物的数据帧,它需要几分钟的时间才能从A到达B,依此类推。
我尝试了以下代码,但无法获得结果。
df<-data.frame(type =c("X","Y","Z"), "A_to_B"= c(20,56,57), "B_to_C"= c(10,35,50), "C_to_D"= c(53,20,58))
ggplot(df, aes(x = 1,y = df$type)) + geom_line() + facet_grid(type~.)
我已经附加了来自excel的图像,这是期望的输出,但是我只需要有连接的垂直线,而不是整个水平线。
答案 0 :(得分:0)
在您的情况下,我不会使用方面,因为只有3个变量。
因此,要使用ggplot2在R中获得类似的图,您首先需要使用tidyverse包中的collect()重新格式化数据框。然后是长整齐的格式。
据我所知,在标准ggplot2中没有可以满足您需求的几何图形,因此需要进行一些摆弄。
但是,可以使用geom_segment()和cumsum()生成图:
library(tidyverse)
# First reformat and calculate cummulative sums by type.
# This works because factor names begins with A,B,C
# and are thus ordered correctly.
df <- df %>%
gather(-type, key = "route", value = "time") %>%
group_by(type) %>%
mutate(cummulative_time = cumsum(time))
segment_length <- 0.2
df %>%
mutate(route = fct_rev(route)) %>%
ggplot(aes(color = route)) +
geom_segment(aes(x = as.numeric(type) + segment_length, xend = as.numeric(type) - segment_length, y = cummulative_time, yend = cummulative_time)) +
scale_x_discrete(limits=c("1","2","3"), labels=c("Z", "Y","X"))+
coord_flip() +
ylim(0,max(df$cummulative_time)) +
labs(x = "type")
该解决方案之所以有效,是因为它在scale_x_discrete中将值分配给X,Y,Z。小心分配正确的标签!还要比较this answer。