5

座標x、yのnペアのリストの場合、特定の色の異なる点間の線をプロットする方法はありますか?

これまでに実装した解決策は、プロット関数を使用するのではなく、色が必要な範囲を選択する行を使用することです。ここに例があります:

x <- 1:100
y <- rnorm(100,1,100)
plot(x,y ,type='n')
lines(x[1:50],y[1:50], col='red')
lines(x[50:60],y[50:60], col='black')
lines(x[60:100],y[60:100], col='red')

これを行う簡単な方法はありますか?

4

5 に答える 5

7

はい、これを行う 1 つの方法は、 を使用することggplotです。

ggplotデータがdata.frameフォーマットされている必要があります。これに、希望の色を示すdata.frame列を追加します。col 変数はすでに色であるため、colプロットは 、 、 で作成されggplotますgeom_linescale_colour_identity

library(ggplot2)

df <- data.frame(
  x = 1:100,
  y = rnorm(100,1,100),
  col = c(rep("red", 50), rep("black", 10), rep("red", 40))
)

ggplot(df, aes(x=x, y=y)) + 
  geom_line(aes(colour=col, group=1)) + 
  scale_colour_identity()

ここに画像の説明を入力

より一般的には、各線分は異なる色にすることができます。次の例では、色を x 値にマッピングして、色が青から赤に滑らかに変化するプロットを作成します。

df <- data.frame(
  x = 1:100,
  y = rnorm(100,1,100)
)

ggplot(df, aes(x=x, y=y)) + geom_line(aes(colour=x))

ここに画像の説明を入力


また、基本グラフィックスの使用を主張する場合はsegments、次のように使用します。

df <- data.frame(
  x = 1:100,
  y = rnorm(100,1,100),
  col = c(rep("red", 50), rep("black", 10), rep("red", 40))
)

plot(df$x, df$y, type="n")
for(i in 1:(length(df$x)-1)){
  segments(df$x[i], df$y[i], df$x[i+1], df$y[i+1], col=df$col[i])
}

ここに画像の説明を入力

于 2011-10-12T18:26:36.613 に答える
4

基本ライブラリのみを使用したワンライナー:

segments(head(x, -1), head(y, -1), x[-1], y[-1], rep(c("red", "black", "red"), c(49, 10, 40)))

( Andrie のセグメントの使用法に触発されたものです。hist の投稿とそこでの議論を参照してください)

興味深いことに、これは次のように短縮できます。

segments(head(x, -1), head(y, -1), x[-1], y[-1], rep(c("red", "black"), c(49, 10)))
于 2011-10-13T20:38:31.950 に答える
4

@joran やその他のラティス ファンの方は...

xyplot(y~x, data=df, panel=function(x,y,subscripts, groups, ...) {
  for(k in seq_len(length(subscripts)-1)) {
    i <- subscripts[k]
    j <- subscripts[k+1]
    panel.segments(df$x[i], df$y[i], df$x[j], df$y[j], col=df$col[i])
  }
})

残念ながら、私はそれを行う巧妙な方法を知らないので、基本的には基本ソリューションをパネル関数にラップしています。上記は、 a を使用し|てグループごとに分割する場合に正しく機能します。たとえば、y~x|a変数を次のように使用aします。

df <- data.frame(
  x = 1:100,
  y = rnorm(100,1,100),
  col = c(rep("red", 50), rep("black", 10), rep("red", 40)),
  a = 1:2
)

group=同様に使用するには、次のものが必要です。

xyplot(y~x, group=a, data=df, panel=function(x,y,subscripts, groups, ...) {
  if(missing(groups)) { groups <- rep(1, length(subscripts)) }
  grps <- split(subscripts, groups)
  for(grp in grps) {
    for(k in seq_len(length(grp)-1)) {
      i <- grp[k]
      j <- grp[k+1]
      panel.segments(df$x[i], df$y[i], df$x[j], df$y[j], col=df$col[i])
    }
  }
})
于 2011-10-13T13:34:19.253 に答える
2

x値ではなくy値に基づいて色を設定する場合は、を使用しますplotrix::clplot。それは素晴らしい、素晴らしい、スーパーデュパー機能です。免責事項:私はそれを書いた:-)。したがって、clplot()は、yが指定された範囲の値をとるデータの領域を強調表示します。補足として:Chaseのコメントを次のように拡張できます。

plot(x,y,t='p', col=colorlist[some_function_of_x]) 

ここで、colorlistは色や色名などのベクトルであり、ニーズに合ったアルゴリズムを選択します。アンドリーの最初のプロットは
colorlist=c('red','black')

plot(x,y,t='p', col=colorlist[1+(abs(x-55)<=5)])

于 2011-10-12T19:47:44.967 に答える
0

基本ライブラリでは、そうではないと思います(ただし、ggplot などについては話せません)。関数を見てlines、ベクトルとして col を供給しようとしています...: うまくいきません。私はあなたと同じようにします。

アンドリーとの議論の後に編集し、彼の投稿に触発されました。1回の呼び出しで使用できますsegments()。そこでの議論を参照してください。

于 2011-10-12T18:26:37.350 に答える