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