这是我的目标:根据 R 中的 x 和 y 形成的 bin 绘制 z 的平均值

This is my goal: Plot the average of z according to bins formed by x and y in R

所以我遇到了这个答案 ,我的问题是,如果我有三个变量并且我想使用 x 和 y 来创建 bin,比如在中使用 cut 和 table另一个答案,然后我如何将 z 绘制为落入这些箱子的所有可变 Z 数据的平均值?

这是我拥有的:

library(plot3D)

x <- data$OPEXMKUP_PT_1d
y <- data$prod_opex


z <- data$ab90_ROIC_wogw3

x_c <- cut(x, 20)
y_c <- cut(y, 20)
cutup <- table(x_c, y_c)
mat <- data.frame(cutup)


hist3D(z = cutup, border="black", bty ="g",
       main = "Data", xlab = "Markup",
       ylab ="Omega", zlab = "Star")

但它显示 z 作为频率,当我尝试时,

hist3D(x, y, z, phi = 0, bty = "g",  type = "h", main = 'NEWer',
       ticktype = "detailed", pch = 19, cex = 0.5,
       xlim=c(0,3),
       ylim=c(-10,20),
       zlim=c(0,1))

想了半天报错,

Error: protect(): protection stack overflow
Graphics error: Plot rendering error

它会很好地进行 3d 散点,但数据没有意义,因为 Z 变量是一个大部分落在 0 和 1 之间的比率,所以你会得到一堆高线和一堆短线.我希望它们按 bin 平均以显示平均比率如何随着 x 和 y 的变化而变化。如果有办法做到这一点,请告诉我。

不确定您的数据到底是什么样子,所以我做了一些。您应该能够根据自己的需要进行调整。这有点 hacky/brute 强制执行,但如果您的数据不是太大而无法减慢循环速度,则可以正常工作。

library(plot3D)

# Fake it til you make it
n = 5000
x = runif(n)
y = runif(n)
z = x + 2*y + sin(x*2*pi)

# Divide into bins
x_c = cut(x, 20) 
y_c = cut(y, 20) 
x_l = levels(x_c)
y_l = levels(y_c)

# Compute the mean of z within each x,y bin
z_p = matrix(0, 20, 20) 
for (i in 1:length(x_l)){
    for (j in 1:length(y_l)){
        z_p[i,j] = mean(z[x_c %in% x_l[i] & y_c %in% y_l[j]])
        }   
    }   

# Get the middle of each bin
x_p = sapply(strsplit(gsub('\(|]', '', x_l), ','), function(x) mean(as.numeric(x)))
y_p = sapply(strsplit(gsub('\(|]', '', y_l), ','), function(x) mean(as.numeric(x)))

# Plot
hist3D(x_p, y_p, z_p, bty = "g",  type = "h", main = 'NEWer',
       ticktype = "detailed", pch = 19, cex = 0.5)

基本上,我们只是通过遍历 bin 手动计算平均 bin 高度 z。可能有更好的计算方法。