Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于另一个值对散点图进行颜色编码-无散点图_R - Fatal编程技术网

R 基于另一个值对散点图进行颜色编码-无散点图

R 基于另一个值对散点图进行颜色编码-无散点图,r,R,我必须绘制一些绘图(x,y)散点,但我希望根据连续变量z的值对点进行颜色编码 我想要一个温度调色板(从深蓝色到亮红色)。我尝试使用Rcolorbrewer,但是RdBu调色板(类似于温度调色板)使用白色作为中间值,这看起来非常糟糕 我还想绘制一个图例,用颜色样本和相应的值来解释颜色编码 如果这可以在R中轻松实现,有什么想法吗?请不要 向大家致以节日的问候这里有一些用默认软件包(基本、图形、GR设备)实现的自制代码: 以下是一些使用默认软件包(基本、图形和设备)实现此功能的自制代码: 这是一个合理

我必须绘制一些绘图(x,y)散点,但我希望根据连续变量z的值对点进行颜色编码

我想要一个温度调色板(从深蓝色到亮红色)。我尝试使用Rcolorbrewer,但是RdBu调色板(类似于温度调色板)使用白色作为中间值,这看起来非常糟糕

我还想绘制一个图例,用颜色样本和相应的值来解释颜色编码

如果这可以在R中轻松实现,有什么想法吗?请不要


向大家致以节日的问候

这里有一些用默认软件包(基本、图形、GR设备)实现的自制代码:


以下是一些使用默认软件包(基本、图形和设备)实现此功能的自制代码:


这是一个合理的解决方案——我使用蓝色而不是深蓝色作为起点,但您可以查看
?rgb
等,根据您的喜好调整颜色

nbrk <- 30
x <- runif(20)
y <- runif(20)
cc <- colorRampPalette(c("blue","red"))(nbrk)
z <- runif(20)
plot(x,y,col=cc[cut(z,nbrk)],pch=16)

nbrk这是一个合理的解决方案——我使用蓝色而不是深蓝色作为起点,但您可以查看
?rgb
等,根据您的喜好调整颜色

nbrk <- 30
x <- runif(20)
y <- runif(20)
cc <- colorRampPalette(c("blue","red"))(nbrk)
z <- runif(20)
plot(x,y,col=cc[cut(z,nbrk)],pch=16)

nbrk根据@BenBolker的答案,如果你看一下
filled.contour的代码,你就可以做图例了。我将该函数拆分为如下所示:

    scatter.fill <- function (x, y, z, 
                              nlevels = 20, plot.title, plot.axes, 
                              key.title, key.axes, asp = NA, xaxs = "i", 
                              yaxs = "i", las = 1, 
                              axes = TRUE, frame.plot = axes, ...) 
    {
        mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar
        on.exit(par(par.orig))
        w <- (3 + mar.orig[2L]) * par("csi") * 2.54
        layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w)))
        par(las = las)
        mar <- mar.orig
        mar[4L] <- mar[2L]
        mar[2L] <- 1
        par(mar = mar)

        #Some simplified level/color picking
        levels <- seq(min(z),max(z),length.out = nlevels)
  col <- colorRampPalette(c("blue","red"))(nlevels)[rank(z)]

        plot.new()
        plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i", 
            yaxs = "i")
  rect(0, levels[-length(levels)], 1, levels[-1L], col = colorRampPalette(c("blue","red"))(nlevels)
        if (missing(key.axes)) {
            if (axes) 
                axis(4)
        }
        else key.axes
        box()
        if (!missing(key.title)) 
            key.title
        mar <- mar.orig
        mar[4L] <- 1
        par(mar = mar)

        #Simplified scatter plot construction
        plot(x,y,type = "n")
        points(x,y,col = col,...)

        if (missing(plot.axes)) {
            if (axes) {
                title(main = "", xlab = "", ylab = "")
                Axis(x, side = 1)
                Axis(y, side = 2)
            }
        }
        else plot.axes
        if (frame.plot) 
            box()
        if (missing(plot.title)) 
            title(...)
        else plot.title
        invisible()
    }

scatter.fill以@BenBolker的答案为基础,如果你看一看
filled.contour的代码,就可以创建图例。我将该函数拆分为如下所示:

    scatter.fill <- function (x, y, z, 
                              nlevels = 20, plot.title, plot.axes, 
                              key.title, key.axes, asp = NA, xaxs = "i", 
                              yaxs = "i", las = 1, 
                              axes = TRUE, frame.plot = axes, ...) 
    {
        mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar
        on.exit(par(par.orig))
        w <- (3 + mar.orig[2L]) * par("csi") * 2.54
        layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w)))
        par(las = las)
        mar <- mar.orig
        mar[4L] <- mar[2L]
        mar[2L] <- 1
        par(mar = mar)

        #Some simplified level/color picking
        levels <- seq(min(z),max(z),length.out = nlevels)
  col <- colorRampPalette(c("blue","red"))(nlevels)[rank(z)]

        plot.new()
        plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i", 
            yaxs = "i")
  rect(0, levels[-length(levels)], 1, levels[-1L], col = colorRampPalette(c("blue","red"))(nlevels)
        if (missing(key.axes)) {
            if (axes) 
                axis(4)
        }
        else key.axes
        box()
        if (!missing(key.title)) 
            key.title
        mar <- mar.orig
        mar[4L] <- 1
        par(mar = mar)

        #Simplified scatter plot construction
        plot(x,y,type = "n")
        points(x,y,col = col,...)

        if (missing(plot.axes)) {
            if (axes) {
                title(main = "", xlab = "", ylab = "")
                Axis(x, side = 1)
                Axis(y, side = 2)
            }
        }
        else plot.axes
        if (frame.plot) 
            box()
        if (missing(plot.title)) 
            title(...)
        else plot.title
        invisible()
    }


scatter.fill无ggplot…嗯,晶格呢?可以尝试一下,但我希望有一个r基解决方案。无ggplot…嗯,晶格呢?可以尝试一下,但我希望有一个r基解决方案。非常感谢。是否可以删除颜色框的黑色水平线?@ECII是。它们是用
rect
绘制的。请参阅
rect
border
参数。非常感谢。然而,我认为代码有问题。例如,绘制散布。填充(x,y,y)…我找到了它。您应该在列中添加[rank(z)]参数。您可能希望自己更正它或批准我的编辑。另外,定义nlevels=长度(z)有意义吗?@ECII是的,捕捉得好。生成的函数仍然有点混乱,但希望从
填充中查看代码。contour
很有启发性。非常感谢。是否可以删除颜色框的黑色水平线?@ECII是。它们是用
rect
绘制的。请参阅
rect
border
参数。非常感谢。然而,我认为代码有问题。例如,绘制散布。填充(x,y,y)…我找到了它。您应该在列中添加[rank(z)]参数。您可能希望自己更正它或批准我的编辑。另外,定义nlevels=长度(z)有意义吗?@ECII是的,捕捉得好。生成的函数仍然有点混乱,但希望从填充的
中查看代码。轮廓
很有启发性。向此添加图例如何?编辑以包含图例。向此添加图例如何?编辑以包含图例。
x <- runif(40)
y <- runif(40)
z <- runif(40)
scatter.fill(x,y,z,nlevels = 40,pch = 20)