【问题标题】:ggplot2 - geom_ribbon bug?ggplot2 - geom_ribbon 错误?
【发布时间】:2011-04-22 11:27:46
【问题描述】:

这段代码抛出一个错误,我不知道为什么......

library( plyr )
library( ggplot2 )
library( grid )
library( proto )

# the master dataframe
myDF = structure(list(Agg52WkPrceRange = c(2L, 2L, 2L, 2L, 2L, 2L, 3L, 
5L, 3L, 5L, 3L, 5L, 3L, 2L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 3L, 4L, 3L, 4L, 4L, 4L, 4L), OfResidualPntReturn52CWk = c(0.201477324, 
0.22350293, 0.248388728, 0.173871456, 0.201090654, 0.170666183, 
0.18681883, 0.178840521, 0.159744891, 0.129811042, 0.13209741, 
0.114989407, 0.128347625, 0.100945992, 0.057017002, 0.081123718, 
0.018900252, 0.021784814, 0.081931816, 0.059067844, 0.095879746, 
0.038977508, 0.078895248, 0.051344317, 0.077515295, 0.011776214, 
0.099216033, 0.054714439, 0.022879951, -0.079558277, -0.050889584, 
-0.006934821, -0.003407085, 0.032545474, -0.003387139, 0.030418511, 
0.053942523, 0.051398537, 0.073482355, 0.087963039, 0.079555591, 
-0.040490418, -0.130754663, -0.125826649, -0.141766316, -0.150708718, 
-0.171906882, -0.174623614, -0.212945405, -0.174480554), IndependentVariableBinned = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 3L, 10L, 3L, 10L, 4L, 10L, 4L, 2L, 4L, 4L, 
4L, 5L, 2L, 2L, 2L, 3L, 3L, 5L, 5L, 5L, 5L, 6L, 3L, 6L, 6L, 6L, 
6L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 9L, 8L, 9L, 9L, 9L, 9L, 
10L, 10L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10"), class = "factor")), .Names = c("Agg52WkPrceRange", 
"OfResidualPntReturn52CWk", "IndependentVariableBinned"), row.names = 28653:28702, class = "data.frame")

# secondary data frame
meansByIndependentVariableBin = ddply( myDF , .( IndependentVariableBinned ) , function( df ) mean( df[[ "OfResidualPntReturn52CWk" ]] ) )

# construct the plot
thePlot = ggplot( myDF , aes_string( x = "IndependentVariableBinned" , y = "OfResidualPntReturn52CWk" ) )
thePlot = thePlot + geom_point( data = meansByIndependentVariableBin , aes( x = IndependentVariableBinned , y = V1 ) )
thePlot = thePlot + geom_line( data = meansByIndependentVariableBin , aes( x = IndependentVariableBinned , y = V1 , group = 1 )  )
thePlot = thePlot + geom_ribbon( data = meansByIndependentVariableBin , aes( group = 1 ,  x = IndependentVariableBinned , ymin = V1 - 1 , ymax = V1 + 1 ) )

# print - error!
print( thePlot )

我尝试过使用/不使用 group=1。错误是:

Error in eval(expr, envir, enclos) : 
  object 'OfRelStrength52CWk' not found

但不确定这有什么关系??我一定遗漏了一些明显的东西。去掉最后一个几何图形(丝带),它的绘图就很好了!

【问题讨论】:

  • 可以提供myDF的dput()吗?或其中的一个子集来说明您的问题,以便其他人可以尝试复制。
  • 它是一个相当大的数据表......即使我只是 x/y 的子集。我知道 y 永远不是 NA。 x 可以有 NA。 IndependentVariableBinned 将 x 从 1 到 10 分箱,并将 NA 放在它自己的 NA 箱中。这有帮助还是我应该尝试输出数据?
  • 我想我会尝试输出(相关)数据。如果您执行head(dput(myDF), 50) 之类的操作,它应该很容易处理,并且希望能够重现您看到的错误。
  • @Chase - 很棒的建议。我已经修改了原来的帖子。这个简化的例子产生了同样的失败。你能看一下吗?
  • @SFun 你能不能不要命名这么长的数据框名称和变量名称。我试图正确输入这些术语而没有拼写错误,我被杀了。不得已,我将它们重命名为更短的名称!

标签: r ggplot2


【解决方案1】:

geom_ribbon 中没有错误。您的错误是因为您在 ggplot 调用中定义了 y = OfResidualPntReturn52CWk ,因此 geom_ribbon 正在寻找它。由于您将不同的数据帧传递给geom_ribbon,因此存在混淆并因此出现错误。从您的绘图调用中,尽管您在 ggplot 调用中使用了y = OfResidualPntReturn52CWk,但没有您调用它的层,因此它对绘图无关紧要。

这里是如何正确地做到这一点(如果我理解你打算在这个情节中做什么)

MIVB    = meansByIndependentVariableBin
thePlot = ggplot(myDF , aes(x = IndependentVariableBinned)) +
  geom_point(aes(y = OfResidualPntReturn52CWk)) +
  geom_point(data = MIVB, aes(y = V1), colour = 'red') + 
  geom_line(data = MIVB , aes(y = V1, group = 1), colour = 'red') +
  geom_ribbon(data = MIVB, aes(group = 1, ymin = V1 - 1 , ymax = V1 + 1), 
     alpha = 0.2)

这是它产生的输出

这是另一种方法,无需预先计算方法。我还在功能区中使用了平均 +- 标准误差,因为我发现 +- 1 的选择是任意的

myDF$IndependentVariableBinned = as.numeric(myDF$IndependentVariableBinned)
thePlot = ggplot(myDF , aes(x = IndependentVariableBinned, y = 
   OfResidualPntReturn52CWk)) +
   geom_point() +
   geom_point(stat = 'summary', fun.y = 'mean', colour = 'red') + 
   geom_line(stat = 'summary', fun.y = 'mean', colour = 'red') +
   geom_ribbon(stat = 'summary', fun.data = 'mean_se', alpha = 0.2)

这会产生

【讨论】:

  • @Ramnath - 我认为 ggplot 有能力对不同的数据帧进行分层?虽然在这个特定的例子中 y = OfResidualPntReturn52CWk 并不重要,但这只是一个简化的例子,我实际上可以使用那个 y。也许我在这里缺少一些核心概念?我在 geom_ribbon 调用中明确定义了 ymin 和 ymax……这还不够吗?
  • @Ramnath - 另一种表述方式是如何保留 ggplot(...) 行并修复代码以显示功能区?
  • @SFun。是的,你是。但是通过在全局 ggplot 调用中定义y,无论您使用什么数据框,所有层都将尝试找到该变量。因此,始终建议仅在您打算使用它们的层中定义变量。请参阅我在答案中的示例
  • @Ramnath - 你能看看我对@Chase 回答的评论吗?我仍然想知道如何保存我原来的 y 作业(只是为了了解 ggplot 的工作原理)
  • @SFun。您拥有的另一个选项是在geom_ribbon 层中显式定义y = NULL,以便它覆盖默认值。这不会引发错误,因为无论如何geom_ribbon 不需要y。在您的代码中尝试此修改,它应该可以工作
【解决方案2】:

@Ramnath 很到位。不需要您对ggplot 的初始调用,因为您绘制的所有图层都来自ddply() 的汇总data.frame。您还可以使用summarize 函数简化对ddply() 的调用:

meansByIndependentVariableBin2 = ddply( myDF , .( IndependentVariableBinned ) 
, summarize, means = mean(OfResidualPntReturn52CWk) )

然后我会这样绘制你的图表:

ggplot(meansByIndependentVariableBin2, aes(x = as.numeric(IndependentVariableBinned), y = means)) +
  geom_ribbon(aes(ymin = (means - 1), ymax = (means + 1)), alpha = .4) + 
  geom_point() + 
  geom_line()

这就是你的想法吗?我在色带图层中添加了一个 Alpha,以便我们可以清楚地看到线条和点。

【讨论】:

  • @Chase - 非常感谢 ddply 的简化(教我有关 ddply 的知识!)以及可能是我的下一个问题的 alpha 建议 =)。不过我仍然很困惑……我完全明白我没有使用我的原始 y,但如果我使用了呢?我试图了解 ggplot 是如何工作的。如果我使用我原来的 y 那么这种情况是不可能的吗?
  • 我会看看我是否可以在 ggplot 书中挖掘参考,但本质上 - 在ggplot(aes()) 中定义的任何美学都将传递给每个后续层,所以如果你有一个美学仅由特定层使用,请勿将其放在对ggplot() 的初始调用中。这就是我将ymin()ymax() 移动到geom_ribbon 层的原因。我不完全确定您想在哪个图层中使用“原始 y”,但您可以像在第一篇文章中那样在图层级别添加它。对于一些结合来自 3+ 个数据集的数据的复杂绘图,我已经开始
  • 空白调用ggplot(),然后为每一层定义我的数据和几何图形。类似ggplot() + geom_polygon(data1, aes(x,y)) + geom_line(data2, aes(x,y)) + geom_xx(dataxx, ...)
  • @Chase - 这是有道理的!所以本质上,最初的 ggplot() 调用使美学成为全球性的,而所有层都具有该层本地的美学?还是图层本身和之前的图层具有局部美学?
  • 数据和美学是该特定层的本地化。将ggplot() + geom_point(data = dat, aes(x,y)) + geom_line(data = dat, aes(x,y))ggplot() + geom_point(data = dat, aes(x,y)) + geom_line() 与定义为数据的dat <- data.frame(x = rnorm(10), y = rnorm(10)) 进行比较。
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 2017-12-14
  • 1970-01-01
  • 2016-09-13
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多