7

我有一些在 0.8.9 中运行良好但在 0.9.1 中运行良好的 ggplot 代码。

我将在其中绘制数据,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))

同样,这在具有 ggplot2 0.8.9 的 R 2.13.2 中运行良好,但在具有 ggplot2 0.9.1 的 R 2.14+ 中却不行。

一种解决方法是:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert))

但这不是解决我的问题的好方法。

也许乱来scale_x_discrete可能会有所帮助?

4

2 回答 2

16

你可以试试这个:

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

这避免了为所选因子水平创建虚拟数据框的需要。which() 命令返回要与 vlines 关联的因子 level[s] 的索引(如果 %in% 运算符的右侧是向量,则返回索引)。

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

于 2012-06-19T13:23:32.990 回答
2

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

于 2012-06-19T02:01:10.783 回答