下面的代码使用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()
我想知道如何用轮廓线显示所有的实际数据点。我试过了
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
中的所有原始数据点。我在那个问题上尝试了这个方法,但没能奏效。
上图不是基于数据集,它正是我期望的,我想要一个带有原始数据点的等高线图。
答案 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..))
创建
这可能是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()
调用中(这可能是因为mtcars
和mtrx.melt
使用相同的列名称)。 colour
美学是不同的,因此每个图层都使用自己的定义。
在致电ggplot()
时,现在需要指定参数名称mapping = aes(...)
,因为ggplot()
期望data
作为第一个参数(如果未命名)。
geom_contour()
,因为代码看起来更加一致,并且在stat_contour()
documentation site上的示例之后似乎优先于ggplot2
。