根据数值向量,在图中以不同颜色标注点

57
我正在使用R的plot()函数绘制下面的图形。它是一个时间偏移向量shiftTime的绘图。我还有另一个强度值向量intensity,范围从 ~3 到 ~9。我想根据这些值用颜色渐变来着色我的绘图点。我能找到的示例都是基于实际绘制点的值进行着色,因此在这种情况下是向量shiftTime的值。是否也可以使用不同的向量,只要相应的值在相同的索引上?

plot

4个回答

130

这里是使用基础R图形的解决方案:

#Some sample data
x <- runif(100)
dat <- data.frame(x = x,y = x^2 + 1)

#Create a function to generate a continuous color palette
rbPal <- colorRampPalette(c('red','blue'))

#This adds a column of color values
# based on the y values
dat$Col <- rbPal(10)[as.numeric(cut(dat$y,breaks = 10))]

plot(dat$x,dat$y,pch = 20,col = dat$Col)

在这里输入图片描述


1
我觉得这可能相当直观,但为了澄清,在调色板中使用的“10”是指范围内颜色的数量。这甚至可以分离出来并分配给一个变量,以获得更可配置的图形。 - Broper
1
这对于顺序递增的数据来说是可以的,但如果有一个点比前一个点低呢?这种颜色编码就无法显示它。 - MadmanLee

24

使用ggplot2的解决方案:

library(ggplot2)

#Some sample data
x <- sort(runif(100))
dat <- data.frame(x = x,y = x^2 + 1)
# Some external vector for the color scale
col <- sort(rnorm(100))

qplot(x, y, data=dat, colour=col) + scale_colour_gradient(low="red", high="blue")

plot


19

为了在基本R中给Joran的回答添加图例:

legend("topleft",title="Decile",legend=c(1:10),col =rbPal(10),pch=20)

这个示例只是为了美观而添加了", cex=0.8":

包括图例的多彩图


2
你如何将这个图例制作成一个连续的颜色渐变条? - colin
1
如何在参数图例中使用正确的值?(而不是legend=c(1:10))? - Sergio
1
使用 cut(dat$y, breaks = 10) 来获取参数图例中的正确值。 - Christophe D.

3

colorRamp()返回一个函数,用于将颜色赋予0:1区间内的数字。

pal <- colorRamp(c("blue", "green", "orange", "red"))

现在可以使用rgb()函数来获取可用的颜色:
rgb(pal(0.5), max=255)
[1] "#7FD200"

因此,如果将向量转换为0-1范围,则可以使用pal()进行颜色分配。
完整演示:
x <- rnorm(1000)

# NOTE: (x-min(x)) / diff(range(x)) transforms x to have a range of 0:1
pal <- colorRamp(c("blue", "green", "orange", "red"))    # 1) choose colors
col <- rgb(pal((x - min(x)) / diff(range(x))), max=255)  # 2) interpolate numbers

plot(x, col=col, pch=19)

img


当您想要绘制具有交替颜色的连续线时,问题就出现了;我无法想到在基本R中除了使用segments之外的其他方法;但是另一个问题随之而来:lend par()选项。 - ivan866
无法处理3D点云。 - Dheeraj Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接