我正在使用如下所示的多个数据框:
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()
。
这对您更一般的情况有用吗?这只是在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包(v0.2.0)创建于2018-04-03。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句