3

下面是我在 R 中创建的 stat_density_2d 图的代码和数据集。

library(ggplot2)

topKzone <- 3.5
botKzone <- 1.6
inKzone <- -0.95
outKzone <- 0.95
kZone <- data.frame(
  x=c(inKzone, inKzone, outKzone, outKzone, inKzone),
  y=c(botKzone, topKzone, topKzone, botKzone, botKzone)
)

df$h <- round(df$platelocheight)
df$s <- round(df$platelocside)
df$es<- round(df$exitspeed)

ggplot(kZone, aes(x,y)) +
  stat_density_2d(data=df, aes(x=s, y=h),geom="polygon") +
  scale_fill_distiller(palette = "Spectral") +
  geom_path(lwd=1.5, col="black") +
  coord_fixed()

数据:

structure(list(platelocheight = c(2.594, 3.803, 3.254, 3.599, 
    3.617, 3.297, 2.093, 3.611, 2.842, 3.316, 2.872, 3.228, 3.633, 
    4.28, 3.309, 2.8, 2.632, 3.754, 2.207, 3.604, 3.443, 2.188, 3.452, 
    2.553, 3.382, 3.067, 2.986, 2.785, 2.567, 3.804), platelocside = c(0.059, 
    -1.596, -0.65, -0.782, -0.301, -0.104, 0.057, -0.807, 0.003, 
    1.661, 0.088, -0.32, -1.115, -0.146, -0.364, -0.952, 0.254, 0.109, 
    -0.671, -0.803, -0.212, -0.069, -0.09, -0.472, 0.434, 0.337, 
    0.723, 0.508, -0.197, -0.635), exitspeed = c(69.891, 73.352, 
    83.942, 85.67, 79.454, 85.277, 81.078, 73.573, 77.272, 59.263, 
    97.343, 91.436, 76.264, 83.479, 47.576, 84.13, 60.475, 61.093, 
    84.54, 69.959, 88.729, 88.019, 82.18, 83.684, 86.296, 90.605, 
    79.945, 59.899, 62.522, 77.75)), .Names = c("platelocheight", 
    "platelocside", "exitspeed"), row.names = c(NA, 30L), class = "data.frame")

代码成功运行,但是,我想添加第三个填充变量(exitspeed)以使其看起来更像热图。我尝试在 stat_density_2d 行中添加 'fill=es',但代码要么忽略 'fill=es' 行,要么说找不到变量 es。

下面是我的代码现在正在绘制的图片以及我希望绘图的样子。

当前代码:

在此处输入图像描述

我想要的是:

在此处输入图像描述

注意:我仍然希望在图表的右侧有一个刻度。

有谁知道如何正确地将第三个变量添加到 stat_density_2d 图中?我也愿意使用其他地块/包来构建这个热图。提前致谢!

4

1 回答 1

1

您的图表有两个问题:
- 首先,评论的不同比例(单位)。这使得不可能stat_density像我在评论中建议的那样简单地为 exitspeed 创建第二个。此外,fill = ..density.. 在这种情况下也不起作用,因为我们谈论的是不同的变量。
- 其次,粗略的 x/y 值(见下文)。

ggplot(kZone, aes(x,y)) +
  stat_density_2d(data=df, aes(x = s, y = h)) +
  geom_raster(data = df, aes(x = s, y = h, fill = exitspeed), interpolate = TRUE) 

#doesn't do the job, as the grid is to coarse

粗略的 x/y 坐标的问题是,插值不是很平滑。可以更改插值参数,但我不知道该怎么做(还)。@JasonAizkalns 向这个方向提出了这个问题- 但不幸的是还没有答案。

不过,更精细的 x/y 坐标肯定会有所帮助。那么为什么不半手动地预测它们呢。

您基本上想要的是为每个 x/y 坐标分配一个出口速度值 - 在您的密度等高线图中!(尽管我个人认为这可能没有真正的意义,因为这些事情不一定相关。)

现在-在下面,我将预测(!)原始图中密度等高线的最大多边形内随机采样的 x/y 的值。让我们来看看:

require(fields) 
require(dplyr)
require(sp)

p <- ggplot_build(ggplot() +
                    stat_density_2d(data = df, aes(x = platelocside, y = platelocheight)) +
                    lims(x = c(-2,2), y = c(1,5)))$data[[1]] %>%
  filter(level == min(level))
#this one is a bit tricky: I increased the limits of the axis of the plot in order to get an 'entire' polygon. I then filtered the rows of the largest polygon (minimum level)

poly_object <- Polygon(cbind(p$x, p$y)) #create Spatial object from polygon coordinates
random_points <- apply(coordinates(spsample(poly_object,10000, type = 'random')),2, round, digits = 1) #(coordinates() pulls out x/y coordinates, I rounded because this unifies the coordinates, and then I sampled random points within this polygon)
tps_x <- cbind(df$platelocside, df$platelocheight) #matrix of independent values for Tps() function
tps_Y <- df$exitspeed      #dependent value for model prediction
fit <- Tps(tps_x, tps_Y)
predictedVal <- predict(fit, random_points) #predicting the exitspeed-values

ggplot() +
  geom_raster(aes(x = random_points[,'x'], y = random_points[,'y'], fill = predictedVal), interpolate = TRUE)+ 
  stat_density_2d(data = df, aes(x = platelocside, y = platelocheight)) +
geom_path(data = kZone, aes(x,y))

在此处输入图像描述

于 2018-08-16T07:12:39.720 回答