繁体   English   中英

x轴上带有分类数据的geom_vline垂直线:ggplot2

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM