使用带有 ggtern() 的 RGB 颜色三角形来识别颜色
Use RGB color triangle with ggtern() to spot a color
多亏了爱德华的回答here,我有了一个 RGB 颜色三角形并做了微小的修改:
plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="")
segments(0,0,0.5,sqrt(3)/2)
segments(0.5,sqrt(3)/2,1,0)
segments(1,0,0,0)
# sm - how smooth the plot is. Higher values will plot very slowly
sm <- 500
for (y in 1:(sm*sqrt(3)/2)/sm){
for (x in (y*sm/sqrt(3)):(sm-y*sm/sqrt(3))/sm){
## distance from base line:
d.red = y
## distance from line y = sqrt(3) * x:
d.green = abs(sqrt(3) * x - y) / sqrt(3 + 1)
## distance from line y = - sqrt(3) * x + sqrt(3):
d.blue = abs(- sqrt(3) * x - y + sqrt(3)) / sqrt(3 + 1)
points(x, y, col=rgb(d.red, d.green, d.blue), pch=19)
}
}
我也有一个RGB代码颜色(例如(232, 103, 101)
),我会在这些坐标上将一个大黑点放入这个RGB颜色三角形中。
这就是为什么我想使用 ggtern()
# install.packages("ggtern")
library(ggtern)
df = data.frame(x=232, y=103, z=101)
breaks = seq(0,1,by=0.2)
#breaks = c(0,255)
ggtern(data = df, aes(x, y, z)) +
geom_point(color = black) +
# I use 255 as the triangle limit, because the RGB code is an [0, 255] interval.
limit_tern(breaks=breaks,labels=255*breaks) +
scale_color_gradient(rgb(d.red, d.green, d.blue))
所以,我的黑点不在正确的坐标上,我的 RGB 三角形颜色也不在 ggtern 的背景上。我对 ggtern 还不太满意。我可以先做一个数据转换吗?
感谢您的帮助
我从 ade4
包中找到了 triangle.plot
的解决方法:
我的 RGB 数据在一个对象 (RGB0) 中,如下所示:
head(RGB0)
R G B
[1,] 87 92 69
[2,] 87 92 69
[3,] 88 93 70
[4,] 88 93 70
[5,] 89 94 71
[6,] 89 94 71
...
代码:
library(ade4)
data2= as.data.frame(RGB0)
head(RGB0)
data2$R <- RGB0[,1]/255
data2$G <- RGB0[,2]/255
data2$B <- RGB0[,3]/255
head(data2)
triangle.plot <- triangle.plot(data2, clab = 0, cpoi = 2, addmean = F, show = FALSE, addaxes = F, scale = F)
points(triangle.plot, pch = 19, cex = 1, col = nacreHEX)
这里是结果:
triangle.plot result
多亏了爱德华的回答here,我有了一个 RGB 颜色三角形并做了微小的修改:
plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="")
segments(0,0,0.5,sqrt(3)/2)
segments(0.5,sqrt(3)/2,1,0)
segments(1,0,0,0)
# sm - how smooth the plot is. Higher values will plot very slowly
sm <- 500
for (y in 1:(sm*sqrt(3)/2)/sm){
for (x in (y*sm/sqrt(3)):(sm-y*sm/sqrt(3))/sm){
## distance from base line:
d.red = y
## distance from line y = sqrt(3) * x:
d.green = abs(sqrt(3) * x - y) / sqrt(3 + 1)
## distance from line y = - sqrt(3) * x + sqrt(3):
d.blue = abs(- sqrt(3) * x - y + sqrt(3)) / sqrt(3 + 1)
points(x, y, col=rgb(d.red, d.green, d.blue), pch=19)
}
}
我也有一个RGB代码颜色(例如(232, 103, 101)
),我会在这些坐标上将一个大黑点放入这个RGB颜色三角形中。
这就是为什么我想使用 ggtern()
# install.packages("ggtern")
library(ggtern)
df = data.frame(x=232, y=103, z=101)
breaks = seq(0,1,by=0.2)
#breaks = c(0,255)
ggtern(data = df, aes(x, y, z)) +
geom_point(color = black) +
# I use 255 as the triangle limit, because the RGB code is an [0, 255] interval.
limit_tern(breaks=breaks,labels=255*breaks) +
scale_color_gradient(rgb(d.red, d.green, d.blue))
所以,我的黑点不在正确的坐标上,我的 RGB 三角形颜色也不在 ggtern 的背景上。我对 ggtern 还不太满意。我可以先做一个数据转换吗?
感谢您的帮助
我从 ade4
包中找到了 triangle.plot
的解决方法:
我的 RGB 数据在一个对象 (RGB0) 中,如下所示:
head(RGB0)
R G B
[1,] 87 92 69
[2,] 87 92 69
[3,] 88 93 70
[4,] 88 93 70
[5,] 89 94 71
[6,] 89 94 71
...
代码:
library(ade4)
data2= as.data.frame(RGB0)
head(RGB0)
data2$R <- RGB0[,1]/255
data2$G <- RGB0[,2]/255
data2$B <- RGB0[,3]/255
head(data2)
triangle.plot <- triangle.plot(data2, clab = 0, cpoi = 2, addmean = F, show = FALSE, addaxes = F, scale = F)
points(triangle.plot, pch = 19, cex = 1, col = nacreHEX)
这里是结果: triangle.plot result