带字符xintercept的geom_vline

Jar*_*red 7 plot r ggplot2

我有一些ggplot代码在0.8.9但没有在0.9.1中工作正常.

我将绘制数据,theDF并希望绘制一条垂直线xintercept="2010 Q1." theGrid仅用于创建theDF.

theGrid <- expand.grid(2009:2011, 1:4)
theDF <- data.frame(YrQtr=sprintf("%s Q%s", theGrid$Var1, theGrid$Var2), 
                    Minutes=c(1000, 2200, 1450, 1825, 1970, 1770, 1640, 1920, 1790, 1800, 1750, 1600))
Run Code Online (Sandbox Code Playgroud)

使用的代码是:

g <- ggplot(theDF, aes(x=YrQtr, y=Minutes)) + 
         geom_point() + 
         opts(axis.text.x=theme_text(angle=90))

g + geom_vline(data=data.frame(Vert="2010 Q2"), aes(xintercept=Vert))
Run Code Online (Sandbox Code Playgroud)

同样,这在R 2.13.2中使用ggplot2 0.8.9也很好,但在R 2.14+中没有ggplot2 0.9.1.

解决方法是:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert))
Run Code Online (Sandbox Code Playgroud)

但这对我的问题不是一个好的解决方案.

也许乱搞scale_x_discrete可能有帮助吗?

小智 15

你可以试试这个:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1')))
Run Code Online (Sandbox Code Playgroud)

这避免了为所选因子级别创建虚拟数据帧的需要.which()命令返回与vlines关联的因子级别[s]的索引(或者如果%运算符中%的右侧是索引的索引).

对此的一个警告是,如果某些类别没有出现在您的数据中并且您drop = TRUE在比例中使用,那么这些行将不会显示在正确的位置.


Joh*_*ohn 2

当您使用字符向量或因子作为图中的 x 轴时,为每个唯一项指定的默认值只是从 1 开始的整数。因此,如果您的级别为 c("A" "B" , "C") 则 x 轴位置为 c(1,2,3)。没有角色位置这样的东西,只有角色标签。如果您想要在 A 处有一条垂直线,则将其设置为 1。如果您希望其位于 A 和 B 之间的中间,则将其设置为 1.5。同样,这些是默认值。如果某个特定的情节做了其他事情,您可以通过在几个位置放置线条并看看会发生什么来轻松解决这个问题。