我正在处理多个看起来像这样的数据框:
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()
时的情况一样。
答案 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。