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

Cac*_*tus 3 r ggplot2 categorical-data

我有按类排序的数据,如本文所述: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)
Run Code Online (Sandbox Code Playgroud)

我想不通的是,如何在 4 左右的两个条形之间准确添加一条垂直线,因此该线完全位于 x 轴值处。我找到了这篇文章,但这对我没有帮助: How to get a vertical geom_vline to an x​​-axis of class date? 任何帮助表示赞赏。也许我太新,无法将解决方案适应我的 data.frame,如果是这样,请原谅这个问题。

Mar*_*son 5

如果您知道要在两条线之间穿行的两个条形的标签,则可以将它们的位置转换为数字(它们映射到的因子),然后传递:

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))
Run Code Online (Sandbox Code Playgroud)

如果它跳过组,您可能应该确保绘制了因子的所有水平。当您对连续数据进行分箱时,最好不要降低中间级别。

p1 +
  geom_vline(aes(xintercept = myLoc)) +
  scale_x_discrete(drop = FALSE)
Run Code Online (Sandbox Code Playgroud)

或者,您可以从数据中删除缺失的级别(在绘图和计算之前myLoc):

df.v <- droplevels(df.v)
Run Code Online (Sandbox Code Playgroud)

然后它将只包括将被绘制的。

作为最后一个选项,您可以使用geom_histogramwhich 自动进行分箱,但将数据保留在原始比例上,这将使添加线条更容易。

ggplot(df.v
       , aes(val)) +
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = 4)
Run Code Online (Sandbox Code Playgroud)