平滑的二维表面

10

我正在考虑是否有可能使这个图表更加平滑或者以其他方式让它变得更好,因为现在像素太粗了。

  library(ggplot2)
  library(reshape2)

   # plot2d = melt(c)
   plot2d = melt(matrix(rnorm(20), 5)) # fake data

    names(plot2d) <- c("x", "y", "z")

    v <- ggplot(plot2d, aes(x, y, z = z))
            v + geom_tile(aes(fill = z)) + 
                scale_alpha_continuous(limits=c(start.point, end.point))  +
                scale_fill_gradient2('TYYYT',low="green", mid = "white", high="red")

输入图像描述


很难在没有数据的情况下进行复现。在这种情况下,一些虚假数据也将非常简单。 - Mike Wise
显而易见的方法是插值数据。如果您提供了一些虚假数据,我想会有人解决这个问题。 - Mike Wise
我已经添加了一些虚假数据 - Aleksandr Ianevski
1个回答

12
library(ggplot2)
library(reshape2)

set.seed(101)
## set dimnames so that melt() picks them up
m <- matrix(rnorm(20),5,dimnames=list(x=1:5,y=1:4))

plot2d_1 <- melt(m,value.name="z")

gg0 <- ggplot(plot2d_1, aes(x,y,z=z,fill=z))

enter image description here

使用geom_raster()并设置interpolate=TRUE是平滑此图的最简单方法(有关其他优点,请参见?geom_tile)。
gg0 + geom_raster(interpolate=TRUE)

enter image description here

您也可以使用fields包手动执行(双线性)插值(有很多选项:例如library(sos); findFn("{bilinear interpolation}"))。
library(fields)
m2 <- interp.surface.grid(list(x=1:5,y=1:4,z=m),
              grid.list=list(x=seq(1,5,length=101),
                             y=seq(1,4,length=101)))
dimnames(m2$z) <- list(x=m2$x,y=m2$y)

现在将其熔化并重新绘制:
plot2d_2 <- melt(m2,value.name="z")
gg0 %+% plot2d_2 + geom_tile()    

enter image description here

嗯,插值似乎改变了z轴比例尺 - 你需要小心处理...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接