R 用于绘图背景的人类彩色光谱

R 用于绘图背景的人类彩色光谱,r,graphics,colors,gradient,R,Graphics,Colors,Gradient,我正试图通过OpenWetWare()制作一个类似于此的图像。根据@baptiste发现的代码(并重复),我使用rainbow()调色板制作了光谱,生成了曲线 问题和疑问 我产生的渐变与实际的颜色频率不一致。如何生成与实际颜色频率一致(至少非常接近)的光谱(例如,在绿-黄区域中为550 nm,而不是青色)。我肯定rainbow()可能不是生成所需调色板的方法,但我不知道什么是最好的方法 MWE library(colourvision) library(ggplot2) library(gri

我正试图通过OpenWetWare()制作一个类似于此的图像。根据@baptiste发现的代码(并重复),我使用
rainbow()
调色板制作了光谱,生成了曲线

问题和疑问 我产生的渐变与实际的颜色频率不一致。如何生成与实际颜色频率一致(至少非常接近)的光谱(例如,在绿-黄区域中为550 nm,而不是青色)。我肯定
rainbow()
可能不是生成所需调色板的方法,但我不知道什么是最好的方法

MWE

library(colourvision)
library(ggplot2)
library(grid)

gradient <- t(rev(rainbow(20))) # higher value for smoother gradient
g <- rasterGrob(gradient, width = unit(1, "npc"), height = unit(1, "npc"), interpolate = TRUE) 

human <- photor(lambda.max = c(420, 530, 560), lambda = seq(400, 700, 1))

ggplot(data = human, aes(x = Wavelength)) +
  annotation_custom(g, xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) +
  geom_line(aes(y = lambda.max420), color = "white") +
  geom_line(aes(y = lambda.max530), color = "white") +
  geom_line(aes(y = lambda.max560), color = "white") +
  scale_x_continuous(breaks = seq(400, 700, 50)) +
  labs(x = NULL, y = NULL) # Save space for question
库(ColorVision)
图书馆(GG2)
图书馆(网格)

梯度您可以使用
光生物学
软件包中的
w_length2rgb

library(photobiology)

gradient <- t(w_length2rgb(400:700))

#then the rest of your code as it is

请查看
光生物学
软件包中的
w_length2rgb
。一般来说:最好避免在此类图形中使用颜色:它给出了错误的颜色概念。记住,一种颜色可以被视为另一种颜色,这取决于眼睛的适应能力。当他们的主人看到颜色时,看到他们的“笔记”,正如乔治安尼和Madden@GiacomoCatenazzi总的来说,我同意。不过我需要它是为了一个特定的目的。你的解决方案让我接近了。我使用了色度模型和颜色范围,使最右边的峰值实际上是黄色的,就像原来的一样。如果光谱的左端包括“紫罗兰色”那就太好了,但它似乎是在模拟人类可见的光谱,因此会褪色为黑色。你知道一种产生更广光谱的方法吗?谢谢你的时间。我不知道还有其他标准的软件包可以做到这一点,尽管,如果您知道几个点的预期波长颜色值,那么编写一个函数来拉伸使用
rainbow
生成的光谱并不太困难-也许可以使用
近似
函数来插值。我使用数据而不是
ColorVision
来绘制曲线,非常接近我的预期结果,结合您的解决方案。@MichaelSTaylor太棒了!为了完整起见,我已经根据cvrl.org上的颜色数据更新了答案。不完全确定我是否使用了正确的数据集,但它产生了更好的梯度!新的梯度要好得多。你用了我选择的数据集。非常感谢。
conesdata <- read.csv("http://www.cvrl.org/database/data/cones/linss10e_5.csv")
names(conesdata) <- c("Wavelength", "Red", "Green", "Blue")
conesdata[is.na(conesdata)] <- 0
conesdata$colour <- rgb(conesdata$Red, conesdata$Green, conesdata$Blue)   
gradient <- t(conesdata$colour[conesdata$Wavelength >= 400 & conesdata$Wavelength <= 700])

#then the rest of your code as before