Цветовая гамма человека для фона сюжета - PullRequest
2 голосов
/ 16 октября 2019

Я пытаюсь создать изображение, подобное этому, с помощью OpenWetWare ( source ). Я генерирую кривые с помощью пакета colourvision. Я создал цветовую гамму с помощью палитры rainbow(), основываясь на коде @baptiste, найденном здесь (и повторном здесь ).

enter image description here

Проблема и вопрос Полученный мной градиент не соответствует фактическим частотам цвета. Как я могу создать спектр, который совпадает (по крайней мере, близко) с фактическими частотами цвета (например, 550 нм на зелено-желтой территории, а не голубой). Я уверен, что 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

Результат

enter image description here

1 Ответ

2 голосов
/ 16 октября 2019

Вы можете использовать w_length2rgb из пакета photobiology:

library(photobiology)

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

#then the rest of your code as it is

enter image description here

После вашего комментария и просто для полноты вытакже можно использовать данные из 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

enter image description here

...