我希望能够叠加两个带有 alpha 通道的 ggplot2
图表,使得生成的图像能够同时显示两个数据集。这是我的测试数据:
data = read.table(text="P1 -1 0 4\nP2 0 0 2\nP3 2 1 8\nP4 -2 -2 6\nP5 0.5 2 12")
data2 = read.table(text="Q1 1 1 3\nQ2 1 -1 2\nQ3 -1 1 8")
colnames(data) = c("name","x","y","score")
colnames(data2) = c("name","x","y","score")
这是我绘制这些数据的方法:
ggplot(data, aes(x=x,y=y)) +
stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") +
xlim(-3,3) + ylim(-3,3) +
geom_point()
ggplot(data2, aes(x=x,y=y)) +
stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") +
scale_fill_gradient (low = "#FFFFFF", high = "#00FF00") +
xlim(-3,3) + ylim(-3,3) +
geom_point()
第一个图显示data,第二个图显示data2:
现在我想要结合这两个图。下面的图片就是我想得到的效果。我使用桌面上的图像编辑程序将两个图像相乘作为图层来生成它。
我尝试将一个数据集放在另一个数据集之上,但这样并不能将两个图层相乘,而是第二个颜色覆盖了第一个颜色。
ggplot(data, aes(x=x,y=y)) +
stat_density2d(data=data,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
theme(legend.position="none") + scale_fill_gradient (low = "#FFFFFF", high = "#FF0000") +
xlim(-3,3) + ylim(-3,3) +
stat_density2d(data=data2,geom="tile", aes(fill = ..density..,alpha=..density..), contour=FALSE) +
scale_fill_gradient (low = "#FFFFFF", high = "#00FF00")
此外,我收到了这个警告:'fill'的比例已经存在。添加另一个'fill'的比例,它将替换现有的比例。
在R中是否有一种方法可以实现这一点?或者是否有其他方法(如使用smoothScatter等其他函数)可以获得类似的结果?作为一种解决方法,我认为我可以在服务器上使用ImageMagick获得类似的结果,但我更喜欢在R中完成所有操作。
更新1
在ImageMagick中执行两个图层的乘法是这样的;
composite -compose multiply data-red.png data-green.png im-multiply.png
这与上面显示的结果相同。
更新2
@Roland 在他的答案中教我如何在同一图中绘制两个数据集。虽然这很方便,但仍存在一个问题:图像取决于您将数据提供给绘图的顺序。
ggplot(rbind(data.frame(data, group="a"), data.frame(data2, group="b")), aes(x=x,y=y)) +
stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) +
scale_fill_manual(values=c("a"="#FF0000", "b"="#00FF00")) +
geom_point() +
theme_minimal() +
xlim(-3.3, 3.3) + ylim(-3.3, 3.3) +
coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2))
得到以下结果:
当交换这两个数据集的顺序(现在数据集“b”也称为data2放在前面,然后是数据集data也称为“a”),您会得到一个类似的结果,但现在红色占主导地位,因为它后来被绘制,从而覆盖了绿色数据。
ggplot(rbind(data.frame(data2, group="a"), data.frame(data, group="b")), aes(x=x,y=y)) +
stat_density2d(geom="tile", aes(fill = group, alpha=..density..), contour=FALSE) +
scale_fill_manual(values=c("b"="#FF0000", "a"="#00FF00")) +
geom_point() + theme_minimal() +
xlim(-3.3, 3.3) + ylim(-3.3, 3.3) +
coord_cartesian(xlim = c(-3.2, 3.2), ylim = c(-3.2, 3.2))
我需要一种不依赖数据集顺序的解决方案。