与性格xintercept geom_vline(geom_vline with Character

2019-07-30 00:13发布

我有一个在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))

同样,这工作得很好R中2.13.2与GGPLOT2 0.8.9,但GGPLOT2 0.9.1不中的R 2.14+。

一种解决方法是:

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

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

也许瞎搞与scale_x_discrete可能帮助?

Answer 1:

你可以试试这个:

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

这避免了需要建立选定因子水平的虚拟数据帧。 在其中()命令返回的索引(或索引如果在操作者%的%右侧为载体)的因子水平[S]的与vlines关联。

与此有一点要注意的是,如果有些类别不会出现在您的数据和您使用drop = TRUE在规模,则行不会在正确的地方显示出来。



Answer 2:

当你使用一个特征向量,或一个因素,为x轴的情节给每个独特的项目的默认值仅仅是整数,在1开始所以,如果你的水平是C(“A”“B” , “C”),那么在x轴上的位置是C(1,2,3)。 有一个字符的位置,只需一个字符的标签没有这样的事情。 如果你想在一垂直线,然后把它放在1.如果你想在A和B之间的一半,然后把它放在1.5。 再次,这些都是默认值。 如果一个特定的情节做了别的东西,你可以很容易的工作,出通过将线在几个地点,看会发生什么。



文章来源: geom_vline with Character xintercept
标签: r plot ggplot2