如何使用ggplot2合并不同颜色通道中的图

柠檬玫瑰

以下代码绘制了price作为2d binning函数caratdepth使用2d binning的菱形

library(ggplot2)
data(diamonds)
gp <- ggplot(diamonds,aes(x=carat,y=depth,z=price))
gp <- gp +stat_summary_2d()
gp

我现在想不仅代表价格,还代表另一个连续变量,例如x,另一个颜色通道。因此,蓝色的强度会给我,price而红色的强度会给我x(以及可能在绿色通道中编码的第三个变量)。

实现此目标的最佳方法是什么?我是否必须手动对数据进行分类,计算汇总并绘制结果栅格,还是有一种更快的方法?

还是可以使用该z在三个不同的图上执行此操作,然后通过将每个图分配给不同的颜色通道来合并它们?

更新对于一个更明确的示例,以下代码生成三个图(请参见下文)。我想将它们合并为一个图,每个图与一个颜色通道相关联,这样我在一个图中将有一个红色斑点,一个绿色斑点和一个蓝色博客。

library(ggplot2)
n <- 10000
cx <- c(-1, 0, 1)
cy <- c(0,1,-1)
x <- rnorm(n,0,1)
y <- rnorm(n,0,1)
v <- list()
v <- lapply(seq(3),function(i)dnorm(x,cx[i],0.5)*dnorm(y,cy[i],0.5))
data <- data.frame(x,y,v1=v[[1]]/max(v[[1]]),v2=v[[2]/max(v[[2]]), v3=v[[3]]/max(v[[3]]))
gp1 <- ggplot(data, aes(x=x,y=y,z=v1)) + stat_summary_2d() + scale_colour_identity()
gp2 <- ggplot(data, aes(x=x,y=y,z=v2)) + stat_summary_2d() + scale_colour_identity()
gp3 <- ggplot(data, aes(x=x,y=y,z=v3)) + stat_summary_2d()+ scale_colour_identity()

情节2

情节3

情节

特朗布兰德

利用该layer_data()函数,我们可以获取在图层上计算的任何值,然后按需使用它。假设您的示例中已经包含了三个图。gp1gp2gp3

让我们将十六进制转换之前的颜色值保存在新的data.frame中:

cols <- data.frame(r = layer_data(gp1)$value,
                   g = layer_data(gp2)$value,
                   b = layer_data(gp3)$value)

Since these are computed densities, it may be best to rescale them to be within [0,1] first before we transform them to colour hexademical notation:

cols <- apply(cols, 2, scales::rescale)
cols <- rgb(cols[,1], cols[,2], cols[,3])

Now, since the x and y data between each of the plots are the same, we can just grab the x-y coordinates from one of them and combine it with our new colours:

newdata <- cbind(layer_data(gp1)[,c("x","y")], cols)

Because our colours are already in the format that ggplot understands to interpret as colours, we'll use the scale_fill_identity() for plotting this:

ggplot(newdata, aes(x, y, fill = cols)) +
  geom_raster() +
  scale_fill_identity()

Which produced the following for me:

在此处输入图片说明

Alternatively, we can also plot each colour channel as a layer and use alpha to mix these:

cols <- data.frame(r = layer_data(gp1)$value,
                   g = layer_data(gp2)$value,
                   b = layer_data(gp3)$value)
newdata <- cbind(layer_data(gp1)[,c("x","y")], cols)

ggplot(newdata, aes(x, y)) +
  geom_raster(aes(alpha = r), fill = "red") +
  geom_raster(aes(alpha = g), fill = "green") +
  geom_raster(aes(alpha = b), fill = "blue")

Which gave me the following:

在此处输入图片说明

However, keep in mind that the order in which you add the layers is going to affect the look of the plot. In my case, blue came last, so there is a blue sheen over all the other values.

EDIT: The sheen can be largely removed by adding scale_alpha_continuous(range = c(0,1)). The resulting plot looks a lot like the next method, but doesn't mix red and green into bright yellow, which I would argue is more realistic. The extent of the data can no longer be estimated though! (end edit)

Another approach to the alpha strategy that avoids a dominant colour's sheen is to map the rgb values to hsv space, keeping the 'v' constant and set an alpha to the sum of the rows:

cols <- data.frame(r = layer_data(gp1)$value,
                   g = layer_data(gp2)$value,
                   b = layer_data(gp3)$value)
cols <- apply(cols, 2, scales::rescale)
hsv <- t(rgb2hsv(cols[,1], cols[,2], cols[,3]))
hsv <- hsv(h = hsv[,1], s = hsv[,2], v = 1, alpha = scales::rescale(rowMeans(cols)))

newdata <- cbind(layer_data(gp1)[,c("x","y")], hsv)

ggplot(newdata, aes(x, y, fill = hsv)) +
  geom_raster() +
  scale_fill_identity()

在此处输入图片说明

A question that you can ask yourself with that method however, is how accurately you think the yellow bit in between the red and green bit is in representing your data? Also, because we no longer have the background shape, we cannot see anymore what the extent of the data is.

Be aware that not every export method supports having alpha values for colours.

编辑:很遗憾,我不知道优美的图例解决方案,如果有人这样做,请告诉我!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Viridis的ggplot2中的气泡图图例颜色

如何使用 ggplot2 在 R 中绘制包含不同组的条形图?

如何使用图例在ggplot2中创建分段图?

如何使用终端在多个文件中合并不同的行

使用ggplot2,如何从值中获取颜色?

在ggplot2中更改光栅图的颜色

使用ggplot2的堆积面积图的颜色问题

如何使用ggplot2向气泡图添加自定义边缘颜色

如何使用R的ggplot2包更改条形图的颜色?

如何在ggplot2中合并图例?(保持形状、颜色和标签)

如何在matlab中合并不同的图但相同的y轴

如何使用 ggplot2 绘制使用不同数据集的图

在ggplot2中以不同比例绘制多个图

如何使用ggplot2,gridExtra对齐和缩放不同尺寸的图?

如何使用具有不同列长 ggplot2 的数据构建累积密度图?

为什么Purr中的地图功能无法使用ggplot2创建不同的图?

使用R中的ggplot2绘制多个大小不同的饼图的散点图

ggplot2:如何在相同因子的不同图中使用相同的颜色

使用 ggplot2 为特定值制作不同的颜色

使用 ggplot2 绘制多条不同颜色的线条

ggplot2合并颜色并填充图例

如何使用ggplot2将图例标题,键顺序和颜色更改为R中的多堆叠条形图

为高于/低于阈值的值制作具有不同颜色的 ggplot2 热图

ggplot中的热图,每组不同的颜色

如何仅用一个分组变量将ggplot2中的折线图和条形图合并?

如何合并不同的分区

如何修复ggplot2中制作的动态图?

如何在ggplot2中制作累积图层图

如何在ggplot2中控制多个图的宽度?