带字符xintercept的geom_vline

时间:2012-06-19 01:27:26

标签: r plot 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))

使用的代码是:

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))

同样,这在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))

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

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

2 个答案:

答案 0 :(得分:14)

你可以试试这个:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1')))

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

有一点需要注意的是,如果您的数据中没有显示某些类别,并且您在比例中使用了drop = TRUE,则这些行将不会显示在正确的位置。

答案 1 :(得分:1)

当您在绘图中对x轴使用字符向量或因子时,给每个唯一项的默认值只是从1开始的整数。因此,如果您的级别为c(“A” “B”,“C”)然后x轴位置是c(1,2,3)。没有字符位置,只有字符标签。如果你想在A处有一条垂直线,那么把它放在1.如果你想要它在A和B之间的中间位置然后把它放到1.5。同样,这些是默认值。如果一个特定的情节做了别的事情,你可以通过在几个地方放置线条并看看会发生什么来轻松解决这个问题。