Mar*_*ann 10 plot r colors linear-gradients
我想生成一个二维颜色渐变矩形,如右下图所示.我怎么能在R中这样做?使用colorRamp或RColorBrewer或其他功能/包我可以生产漂亮的1D dolor坡道.但是我如何为2D做这个,包括角落里的几种颜色,比如右上方的矩形?

我想得到的是例如以下两种渐变类型:

BTY:我完全忘了提到我在这里找到了上面的图表(由Luca Fenu制作).
试试这个:
m = tcrossprod(sin(seq(0,pi,length=1e2)), cos(seq(0, 3*pi, length=1e2)))
cols = matrix(hcl(h=scales::rescale(m, c(0, 360))), nrow(m))
grid::grid.raster(cols)
Run Code Online (Sandbox Code Playgroud)
您需要找到哪个函数描述您想要的颜色渐变(我使用正弦波进行说明).

编辑:4个角之间的线性插值
library(grid)
library(scales)
m = tcrossprod(seq(1,2,length=1e2), seq(2, 3, length=1e2))
pal <- gradient_n_pal(c("red","green","yellow","blue"), values = c(2, 3, 4, 6), space = "Lab")
cols = matrix(pal(m), nrow(m))
grid.raster(cols)
Run Code Online (Sandbox Code Playgroud)

编辑2:当函数不可分离时,使用外部,
fun_xy <- function(x, y){
abs(y-x) * abs(y+x)
}
z <- outer(seq(-1,1,length=100), seq(-1,1,length=100), FUN = fun_xy)
cols = matrix(hcl(h=scales::rescale(z, c(0, 200))), nrow(z))
grid::grid.raster(cols)
Run Code Online (Sandbox Code Playgroud)

您也可以直接在函数内部进行颜色混合,而不是之后将值映射到颜色标度,
fun_xy <- function(x, y){
R <- (x+1)/2
G <- (1-x)/2
B <- (y+1)/2
A <- 1- 0.5*exp(-(x^2+y^2)/0.2)
rgb(R, G, B, A)
}
z <- outer(seq(-1,1,length=100), seq(-1,1,length=100), FUN = fun_xy)
library(grid)
grid.newpage()
grid::grid.raster(z)
Run Code Online (Sandbox Code Playgroud)

感谢您对我的帖子发表评论 - 我很高兴它产生了一些讨论.这里有一个最小的代码来实现右上角的图 - 我相信还有其他更有效的方法可以做到这一点......但这不需要其他库,并且应该很容易遵循...你可以改变通过使用max_sat和alpha_default变量进行饱和度和alpha混合...
#define extremes of the color ramps
rampk2r <- colorRampPalette(c(rgb( 0/255, 0/255, 0/255), rgb(218/255, 0/255, 0/255)))
rampk2g <- colorRampPalette(c(rgb( 0/255, 0/255, 0/255), rgb( 0/255, 218/255, 0/255)))
# stupid function to reduce every span of numbers to the 0,1 interval
prop <- function(x, lo=0, hi=100) {
if (is.na(x)) {NA}
else{
min(lo,hi)+x*(max(lo,hi)-min(lo,hi))
}
}
rangepropCA<-c(0,20)
rangepropCB<-c(0,20)
# define some default variables
if (!exists('alpha_default')) {alpha_default<-1} # opaque colors by default
if (!exists('palette_l')) {palette_l<-50} # how many steps in the palette
if (!exists('max_sat')) {max_sat<-200} # maximum saturation
colorpalette<-0:palette_l*(max_sat/255)/palette_l # her's finally the palette...
# first of all make an empy plot
plot(NULL, xlim=rangepropCA, ylim=rangepropCB, log='', xaxt='n', yaxt='n', xlab='prop A', ylab='prop B', bty='n', main='color field');
# then fill it up with rectangles each colored differently
for (m in 1:palette_l) {
for (n in 1:palette_l) {
rgbcol<-rgb(colorpalette[n],colorpalette[m],0, alpha_default);
rect(xleft= prop(x=(n-1)/(palette_l),rangepropCA[1],rangepropCA[2])
,xright= prop(x=(n)/(palette_l),rangepropCA[1],rangepropCA[2])
,ytop= prop(x=(m-1)/(palette_l),rangepropCB[1],rangepropCB[2])
,ybottom= prop(x=(m)/(palette_l),rangepropCB[1],rangepropCB[2])
,col=rgbcol
,border="transparent"
)
}
}
# done!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6851 次 |
| 最近记录: |