我想用光譜顏色填充曲線下的區域,得到這樣的圖。

這是我試過的
ggplot(bq, aes(x=w.length, y=s.e.irrad))
geom_segment(aes(xend=w.length, yend=0, colour=abs(w.length)^0.7*sign(w.length)))
geom_line()
scale_colour_gradient2(low=scales::muted("blue"),
mid=scales::muted("green"),
high=scales::muted("red"))
得到這個

也試過 geom_area
ggplot(bq, aes(x = w.length, y = s.e.irrad))
geom_area(fill = "steelblue") #steelblue is for example
但是不能用漸變填充
我的資料幀的波長為 x,輻照度為 y
uj5u.com熱心網友回復:
以下內容應該與您要查找的內容相近。關鍵是要使用scale_color_identity的geom_segment,并通過到顏色審美表示在資料幀中的每個波長的RGB字串。
ggplot(bq, aes(x=w.length, y=s.e.irrad))
geom_segment(aes(xend=w.length, yend=0, colour = nm_to_RGB(w.length)),
size = 1)
geom_line()
scale_colour_identity()

或者,如果您想要更柔和的外觀:
ggplot(bq, aes(x=w.length, y=s.e.irrad))
geom_area(fill = "black")
geom_segment(aes(xend=w.length, yend=0,
colour = nm_to_RGB(w.length)),
size = 1, alpha = 0.3)
geom_line()
scale_colour_identity()

唯一的缺點是您需要定義nm_to_RGB:將光的波長轉換為十六進制字串以表示顏色的函式。我不確定是否有一種“正確”的方法可以做到這一點,但一種可能的實作(我從這里的 javascript 函式翻譯)是:
nm_to_RGB <- function(wavelengths){
sapply(wavelengths, function(wavelength) {
red <- green <- blue <- 0
if((wavelength >= 380) & (wavelength < 440)){
red <- -(wavelength - 440) / (440 - 380)
blue <- 1
}else if((wavelength >= 440) & (wavelength<490)){
green <- (wavelength - 440) / (490 - 440)
blue <- 1
}else if((wavelength >= 490) && (wavelength<510)){
green <- 1
blue = -(wavelength - 510) / (510 - 490)
}else if((wavelength >= 510) && (wavelength<580)){
red = (wavelength - 510) / (580 - 510)
green <- 1
}else if((wavelength >= 580) && (wavelength<645)){
red = 1
green <- -(wavelength - 645) / (645 - 580)
}else if((wavelength >= 645) && (wavelength<781)){
red = 1
}
if((wavelength >= 380) && (wavelength<420)){
fac <- 0.3 0.7*(wavelength - 380) / (420 - 380)
}else if((wavelength >= 420) && (wavelength<701)){
fac <- 1
}else if((wavelength >= 701) && (wavelength<781)){
fac <- 0.3 0.7*(780 - wavelength) / (780 - 700)
}else{
fac <- 0
}
do.call(rgb, as.list((c(red, green, blue) * fac)^0.8))
})
}
顯然,我沒有您的資料集,但以下代碼在正確的范圍內創建了一組合理的資料:
資料
set.seed(10)
bq <- setNames(as.data.frame(density(sample(rnorm(5, 600, 120)))[c("x", "y")]),
c("w.length", "s.e.irrad"))
bq$s.e.irrad <- bq$s.e.irrad * 1e5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/358910.html
