2012-01-26 9 views
0

次の図をわかりやすく再現しようとしています。ラインとポイントの両方をプロットしようとしていることに注意してください。しかし、印刷されるポイントの数が多すぎると、ラインが覆い隠されてしまいます。私はプロットすることができます方法はあります:限定されたポイントで線と点をプロットするにはどうすればよいですか?

  • 異なる点は、異なるデータセットのための形状が、30〜50
  • は、ラインやポイント情報を追加しますと言ってポイント数を制限するさまざまなデータセットのための
  • 異なるライン伝説

enter image description here

マイプロットコードがhereである(これは、SOには大きすぎました)

+0

プロットが経験的な累積分布関数(ecdf)である場合、軸名が示唆するように、プロットの左下に垂直セグメントが存在しない(右上に1つ、他のグループに1つあります)多くの「0」または「1」の値に対応する2つの垂直線分(左下および左上)に点がないことは奇妙に見える(「ecd」列が[0、 1])。 –

答えて

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

+0

はい...完璧!ほぼそこに。ポイントを一様に配置する方法はありますか? – Legend

+0

あなたは、[この手順](http://stackoverflow.com/a/6904434/471093)を定期的に点を描くように調整することができると思います。 – baptiste

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

ありがとうございます。これは素晴らしく見えますが、透明性のためにこれがepsに優しいとは思わないのですか?また、グラフがBWプリンタを使用して印刷されるとき、それはまだ判読できるように、ポイントの凡例が必要です。 – Legend

+0

PostScript(eps)には透明性がありません - 過去10年間にフォーマットが完全にpdfに置き換えられたと思いました... –

+0

+1してください。残念なことに、学術コミュニティでは、何らかの理由でEPSを使用しています。それにもかかわらず、あなたの助けに感謝します。 – Legend

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はきれいになり、より効率的に書かなければなりません...)

+0

この質問は、['barbedGrob'](http://code.google.com/p/gridextra/wiki/barbedGrob)から' ggplot2'のgeomを作成する私の避けたい計画を思い出させます。私は、上記のように、彼らが非常に近くにいるときに、ほんの少しの点を描くという選択肢を持つことは理にかなっているだろうかと思います。 – baptiste

関連する問題