在ggplot

时间:2018-04-03 20:31:45

标签: r ggplot2

我正在处理多个看起来像这样的数据框:

df <- data.frame(year = c(2013, 2014, 2015, 2016),
             number = c(100, 120, 125, 140),
             capacity = c(125, 125, 150, 150))

我想在number和参考year之后将capacity标为条形。更具体地说,我想说明number的值是否以及在多大程度上超过capacity的值,其中后者被绘制为水平线。

capacity不随时间变化时,我可以通过ggplot(df, aes(x = year, y = number)) + geom_col() + geom_hline(yintercept = capacity)轻松实现此目标。但是,当我使用上面的数据框执行此操作时,我逻辑上会获得跨越整个绘图范围的多条线。

我尝试了多种可能的解决方案来解决这个问题。对geom_segment的一系列调用是不切实际的,因为我正在处理许多数据帧,并且capacity会异常地变化。第二个解决方案是:

ggplot(df, aes(x = year, y = number)) + 
       geom_col(width= 0.75) +
       geom_errorbar(aes(ymin = capacity, ymax = capacity), color = "red", size = 2)

这给了我所有正确位置的水平条,但它们没有水平连接 - 更重要的是 - 垂直连接。

最后,在调用geom_step时连接线路如下:

ggplot(df, aes(x = year, y = number)) + 
       geom_col(width= 0.75) +
       geom_step(aes(y = capacity, x = year), color = "red", size = 2)

然而,这里的问题是步进功能在我想要时不会改变(即在几年之间,以便在capacity改变时变得清晰)。这可以通过将geom_step中的美学转移到aes(y = capacity, x = year-0.5)来解决,但是这条线在图的右侧不会延伸得足够远。

希望我想要完成的目标是明确的。理想情况下,顺便说一句,我想将参考线扩展到绘图的边缘,就像调用geom_hline()时的情况一样。

1 个答案:

答案 0 :(得分:1)

这适用于更一般的情况吗?这只是使用了调整 geom_step美学结合编程添加额外的行来填充红线的最后一点。最后一点是数据中最大的一年,加上最后一个容量值。请注意,您的原始数据不会更改。

library(tidyverse)
df <- data.frame(year = c(2013, 2014, 2015, 2016),
                 number = c(100, 120, 125, 140),
                 capacity = c(125, 125, 150, 150))

ggplot(
  data = df %>% 
    arrange(year) %>% 
    add_row(year = max(.$year) + 1, capacity = last(.$capacity)),
  mapping = aes(x = year, y = number)
) + 
  geom_col(width= 0.75) +
  geom_step(aes(y = capacity, x = year - 0.5), color = "red", size = 2)
#> Warning: Removed 1 rows containing missing values (position_stack).

reprex package(v0.2.0)创建于2018-04-03。