如何用ggplot将实际数据点放在等高线图上?

时间:2017-04-07 02:28:32

标签: r ggplot2

下面的代码使用ggplot生成等高线图。

xgrid <-  seq(min(mtcars$wt), max(mtcars$wt), 0.3)
ygrid <-  seq(min(mtcars$hp), max(mtcars$hp), 0.3)

data.fit <-  expand.grid(wt = xgrid, hp = ygrid)

data.loess <- loess(qsec ~ wt * hp, data = mtcars)
mtrx3d <-  predict(data.loess, newdata = data.fit)

mtrx3d[1:4, 1:4]

require(reshape)
mtrx.melt <- melt(mtrx3d, id.vars = c("wt", "hp"), measure.vars = "qsec")
names(mtrx.melt) <- c("wt", "hp", "qsec")

require(stringr)
mtrx.melt$wt <- as.numeric(str_sub(mtrx.melt$wt, str_locate(mtrx.melt$wt, "=")[1,1] + 1))
mtrx.melt$hp <- as.numeric(str_sub(mtrx.melt$hp, str_locate(mtrx.melt$hp, "=")[1,1] + 1))

ggplot(mtrx.melt, aes(x = wt, y = hp, z = qsec)) + stat_contour()

enter image description here

我想知道如何用轮廓线显示所有的实际数据点。我试过了

ggplot(mtrx.melt, aes(x = wt, y = hp, z = qsec)) + 
  stat_contour() + geom_point(mtrx.melt, aes(x = wt, y = hp, z = qsec))

但是这返回了一条错误信息

Error: ggplot2 doesn't know how to deal with data of class uneval

这与此问题类似how-can-i-overlay-points-and-lines-onto-a-contour-plot-with-ggplot2,但基于不同的情况。在那个问题中,op想要用他想要突出显示的特定点来注释轮廓图(这些点存储在不同的数据集中)。我的情况是突出显示mtrx.melt中的所有原始数据点。我在那个问题上尝试了这个方法,但没能奏效。

This is the plot that I expected

上图不是基于数据集,它正是我期望的,我想要一个带有原始数据点的等高线图。

1 个答案:

答案 0 :(得分:1)

有几个问题妨碍产生预期的结果。其中一些已在评论中提及。

然而,OP希望显示实际数据点,但是试图绘制用于内插数据的常规网格mtrx.melt

以下代码

library(ggplot2)
ggplot(mtrx.melt, aes(x = wt, y = hp, z = qsec))+ 
  geom_point(aes(colour = qsec), mtcars) +
  stat_contour(aes(colour = ..level..))

创建

enter image description here

这可能是OP正在寻找的东西。

请注意

  • 现在,轮廓水平采用颜色编码。
  • 显示mtcars数据集的实际数据点。
  • 调用geom_point()之类的参数顺序与ggplot不同。美学和统计数据期望美学mapping为第一参数,data为第二参数。
  • geom_point()之前调用
  • stat_contour(),以确保图例标题为qsec而不是level。在stat_contour()替换geom_tile()时要小心。然后必须将瓷砖绘制为第一层,将点绘制在顶部。

编辑在回复this comment by the OP时,代码可能已经写好了

ggplot(mapping = aes(x = wt, y = hp, z = qsec)) + 
  geom_point(aes(colour = qsec), mtcars) +
  geom_contour(aes(colour = ..level..), mtrx.melt)

这使得更明确的是,使用两个层(即geom_point()geom_contour()来显示两个不同数据源的数据。两个层之间共享的美学被放置在初始ggplot()调用中(这可能是因为mtcarsmtrx.melt使用相同的列名称)。 colour美学是不同的,因此每个图层都使用自己的定义。

在致电ggplot()时,现在需要指定参数名称mapping = aes(...),因为ggplot()期望data作为第一个参数(如果未命名)。

此处使用

geom_contour(),因为代码看起来更加一致,并且在stat_contour() documentation site上的示例之后似乎优先于ggplot2