5

对于n对坐标x,y的列表,有没有办法在特定颜色上绘制不同点之间的线?

到目前为止,我实施的解决方案不是使用绘图功能,而是使用线条选择我想要颜色的范围。这里有一个例子:

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

是的,这样做的一种方法是使用ggplot.

ggplot要求您的数据采用data.frame格式。在此data.frame我添加一列col,指示您想要的颜色。然后用ggplot, geom_line,构造图,scale_colour_identity因为 col 变量已经是一种颜色:

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

对于@joran 和其他 lattice 粉丝...

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 回答
4

仅使用基本库的单线:

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

(灵感来自Andrie 对分段的使用,请参阅他的帖子和那里的讨论)

有趣的是,它可以缩短为:

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

如果要根据 y 值而不是 x 值设置颜色,请使用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 作为向量...:它不起作用。我会和你一样做。

在与 Andrie 讨论并受到他的帖子的启发后进行编辑:您可以segments()在一个电话中使用,请参阅那里的讨论。

于 2011-10-12T18:26:37.350 回答