[英]geom_vline vertical line on x-axis with categorical data: ggplot2
我有按类排序的数据,如本文所述: https : //www.r-bloggers.com/from-continuous-to-categorical/这样可以更轻松地查看哪些值是常见的。 创建完这些类之后,我想使用不同类的频率创建一个条形图,我将使用以下示例代码进行操作:
set.seed(1)
df.v <- data.frame(val = rnorm(1000, mean(4, sd=2)))
df.v$val.clss <- cut(df.v$val, seq(min(df.v$val), max(df.v$val), 1))
p1 <- ggplot(data = df.v)+
geom_bar(aes(val.clss))
plot(p1)
我不知道的是如何在垂直于4的两个条之间添加一条垂直线,因此该线完全位于x轴值处。 我找到了这篇文章,但这对我没有帮助: 如何将垂直的geom_vline获取到上课日期的x轴? 任何帮助表示赞赏。 也许我太新了,无法适应我的data.frame解决方案,如果可以,请原谅。
你想要这样的东西吗?
p1 <- ggplot(data = df.v)+
geom_bar(aes(val.clss)) + geom_vline(xintercept = 3.5, col='red', lwd=2)
plot(p1)
更通用的解决方案可能是这样的:
df.v <- data.frame(val = rnorm(1000, mean=15, sd=4))
df.v$val.clss <- cut(df.v$val, seq(min(df.v$val), max(df.v$val), 1))
lvls <- levels(df.v$val.clss)
lvls
[1] "(2.97,3.97]" "(3.97,4.97]" "(4.97,5.97]" "(5.97,6.97]" "(6.97,7.97]" "(7.97,8.97]" "(8.97,9.97]" "(9.97,11]" "(11,12]" "(12,13]"
[11] "(13,14]" "(14,15]" "(15,16]" "(16,17]" "(17,18]" "(18,19]" "(19,20]" "(20,21]" "(21,22]" "(22,23]"
[21] "(23,24]" "(24,25]" "(25,26]" "(26,27]" "(27,28]" "(28,29]" "(29,30]"
vline.level <- '(18,19]' # you want to draw line here, right before 18
p1 <- ggplot(data = df.v)+
+ geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) +
+ theme(axis.text.x = element_text(angle=90, vjust = 0.5))
plot(p1)
如果您要选择最中间的级别,
length(lvls)
#[1] 27
# choose the middlemost level, since length(lvls) is odd in this case, the midpoint will be ceiling(length(lvls)/2)
vline.level <- lvls[ceiling(length(lvls)/2)]
p1 <- ggplot(data = df.v)+
geom_bar(aes(val.clss)) + geom_vline(xintercept = which(lvls == vline.level) - 0.5, col='red', lwd=2) +
theme(axis.text.x = element_text(angle=90, vjust = 0.5))
plot(p1)
如果知道要在其间移动的两个条的标签,则可以将它们的位置转换为数字(它们映射到的因子),然后传递该数字:
myLoc <-
(which(levels(df.v$val.clss) == "(2.99,3.99]") +
which(levels(df.v$val.clss) == "(3.99,4.99]")) /
2
p1 +
geom_vline(aes(xintercept = myLoc))
如果要跳过组,则可能应确保已绘制因子的所有级别。 对连续数据进行分箱后,最好不要删除中间级别。
p1 +
geom_vline(aes(xintercept = myLoc)) +
scale_x_discrete(drop = FALSE)
或者,您可以一起删除数据中缺少的级别(在绘制和计算myLoc
):
df.v <- droplevels(df.v)
然后,它将仅包括将要绘制的。
作为最后的选择,您可以只使用geom_histogram
,它会自动进行装箱,但会将数据geom_histogram
在原始比例上,这将使添加线变得更加容易。
ggplot(df.v
, aes(val)) +
geom_histogram(binwidth = 1) +
geom_vline(xintercept = 4)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.