使用ggplot2创建具有散点图平均值的网格和颜色单元格

rod*_*dms 4 r data-visualization aggregation ggplot2

给定具有N个点的数值数据集{(x_i,y_i,z_i)},可以通过为每个i = 1,...,N绘制点P_i =(x_i,y_i)并用每个点着色来创建散点图.强度取决于z_i的值.

library(ggplot2)
N = 1000;
dfA = data.frame(runif(N), runif(N), runif(N))
dfB = data.frame(runif(N), runif(N), runif(N))
names(dfA) = c("x", "y", "z")
names(dfB) = c("x", "y", "z")

PlotA <- ggplot(data = dfA, aes(x = x, y = y)) + geom_point(aes(colour = z));
PlotB <- ggplot(data = dfB, aes(x = x, y = y)) + geom_point(aes(colour = z));
Run Code Online (Sandbox Code Playgroud)

假设我已经创建了这些散点图.我想为每个数据集做的是用一个网格(矩形,六边形,三角形,......无关紧要)划分平面,并为网格中的每个单元格着色所有点的平均强度细胞.

另外,假设我已经为两个不同的数据集dfA和dfB创建了两个这样的图PlotA和PlotB(如上所述).设c_i ^ k为曲线k的第i个单元格.我想创建第三个图,使得每个i的c_i ^ 3 = c_i ^ 1*c_i ^ 2.

谢谢.

编辑:最小的例子

MrF*_*ick 6

划分平面并计算矩形的摘要与stat_summary2d函数非常简单.首先,我将创建明确的中断,而不是让ggplot它们选择它们,因此它们对于两个图都是完全相同的

bb<-seq(0,1,length.out=10+1)
breaks<-list(x=bb, y=bb)

p1 <- ggplot(data = dfA, aes(x = x, y = y, z=z)) + 
    stat_summary2d(fun=mean, breaks=breaks) + ggtitle("A");
p2 <- ggplot(data = dfB, aes(x = x, y = y, z=z)) + 
    stat_summary2d(fun=mean, breaks=breaks) + ggtitle("B");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然后得到不同的东西有点麻烦,但我们可以从我们已经创建的图中提取数据并将它们组合起来

#get data
d1 <- ggplot_build(p1)$data[[1]][, 2:4]
d2 <- ggplot_build(p2)$data[[1]][, 2:4]
mm <- merge(d1, d2, by=c("xbin","ybin"))

#turn factor back into numeric values
mids <- diff(bb)/2+bb[-length(bb)]

#plot difference
ggplot(mm, aes(x=mids[xbin], y=mids[ybin], fill=value.x-value.y)) + 
   geom_tile() + scale_fill_gradient2(name="diff") + labs(x="x",y="y")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述