使用ggplot绘制多色垂直线,以将每种类型的平均时间显示为构面。每种类型都有不同的垂直线

时间:2019-06-19 10:02:36

标签: r ggplot2

我想在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的图像,这是期望的输出,但是我只需要有连接的垂直线,而不是整个水平线。

enter image description here

1 个答案:

答案 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")

Line plot

编辑

该解决方案之所以有效,是因为它在scale_x_discrete中将值分配给X,Y,Z。小心分配正确的标签!还要比较this answer