在ggplot2点图表中添加一条垂直的50%线

时间:2012-04-03 16:09:32

标签: r ggplot2

我有一个像这样创建的ggplot2点图表

qplot(Index, Popularity ,data = data.slopeone.agg)

现在我想在所有数据点的一半添加一条垂直线。换句话说,积分是0.5。我想添加这一行,看看数据部分是50%。

我怎样才能在R中实现这一目标?我知道geom_vline,但不知道如何确定vline的位置。

数据的结构如下: 每一行都有一个ItemId,这个项目的受欢迎程度和我的图表的索引,用于显示按人气排序的值。

head(data.slopeone.agg)
    Item Popularity Index
184  258 0.07695880     1
29    50 0.07294129     2
121  181 0.07162558     3
203  286 0.07030986     4
225  313 0.06500478     5
65   100 0.06366796     6

我的图表如下所示:http://img838.imageshack.us/img838/3194/popt.png

2 个答案:

答案 0 :(得分:1)

p <- qplot(data=data.slopeone.agg, x = Index, y = Popularity )

现在识别中值人气价值的“指数”。 请注意,如果存在偶数个观察值,则中位数不会有效。

attach(data.slopeone.agg)

获得人口中位数观察值

medpop=sort(Popularity)[floor(length(Popularity)/2)]

获取该值的索引

lineplace= Index[which(Popularity==medpop)]
detach(data.slopeone.agg)

p + geom_vline(xintercept = lineplace)

答案 1 :(得分:0)

我现在发现了如何解决我的问题。也许这不是最优雅的方式:

定义一个函数来获取50%的流行度数据垂直行位置

getPopularityVLineIndex = function(popData){

  halfPopularity = sum(popData$Popularity) / 2

  # initialize helper variables
  fiftyPercent = 0;
  counter = 1;

  # sum up the popularity values until the half of the sum is reached
  while (fiftyPercent < halfPopularity) {
      fiftyPercent = fiftyPercent + popData$Popularity[which(popData$Index == counter)]
      counter = counter + 1
  }

  # the current counter value is the position of the vertical line
  vLineIndex = counter

  return (vLineIndex)
}

qplot(Index, Popularity ,data = popData) + geom_vline(xintercept = getPopularityVLineIndex(popData), colour="red", linetype = "longdash"))

如果有人知道更优雅的方式,请随意发布。但也许我的问题现在更容易理解;)