如何用有限的点绘制线条和点?

时间:2012-01-26 03:12:36

标签: r graph ggplot2

我试图以更清晰的方式重新绘制下图。观察我试图绘制线条和点。但是,打印的点数太多而且线条被掩盖了。有没有办法可以策划:

  • 不同数据集的不同行
  • 不同数据集的不同点形状,但限制点数为30-50
  • 将线条和点信息添加到图例

enter image description here

我的绘图代码为here(对于SO而言太大了)

3 个答案:

答案 0 :(得分:2)

你需要这样的东西吗?

transData$Type2 <- factor(transData$Type, labels = c("Some Info for P", "Some Info for Q"))    
ggplot(transData, aes(x=Value, y=ecd)) + 
  geom_line(aes(group=Type2,colour=Type2, linetype=Type2), size=1.5) + 
  geom_point(aes(shape = Type2), data = transData[round(seq(1, nrow(transData), length = 30)), ], size = 5) +
  opts(legend.position = "top", legend.key.width = unit(3, "line"))

enter image description here

答案 1 :(得分:1)

您可以绘制大的,部分透明的点:更密集的区域会显得更暗。

p <- ggplot(transData, aes(x=Value, y=ecd, group=Type))
p + 
  geom_point(size=20, colour=rgb(0,0,0,.02))  +
  geom_line(aes(colour=Type), size=3)  

答案 2 :(得分:0)

以下代码或多或少均匀地添加点,但它们不一定是实际数据点(可以插值),

barbedize <- function(x, y, N=10, ...){
  ind <- order(x)
  x <- x[ind]
  y <- y[ind]
  lengths <- c(0, sqrt(diff(x)^2 + diff(y)^2))
  l <- cumsum(lengths)
  tl <- l[length(l)]
  el <- seq(0, to=tl, length=N+1)[-1]

  res <- 
  sapply(el[-length(el)], function(ii){

    int <- findInterval(ii, l)
    xx <- x[int:(int+1)]
    yy <- y[int:(int+1)]

    dx <- diff(xx)
    dy <- diff(yy)
    new.length <- ii - l[int]
    segment.length <- lengths[int+1]

    ratio <- new.length / segment.length

    xend <- x[int] + ratio * dx
    yend <- y[int] + ratio * dy

    c(x=xend, y=yend)

  })
  as.data.frame(t(res))
}


library(plyr)

few_points <- ddply(transData, "Type", function(d, ...)
                    barbedize(d$Value, d$ecd, ...), N=10)

ggplot(transData, aes(x=Value, y=ecd)) + 
     geom_line(aes(group=Type,colour=Type, linetype=Type), size=1) + 
     geom_point(aes(x=x,y=y, colour=Type, shape=Type), data=few_points, size=3) 

shape

(这是一个快速而肮脏的原理验证,barbedize应该被清理并更有效地编写......)