【问题标题】:Passing variable to cut() in ggplot2's aes()在 ggplot2 的 aes() 中将变量传递给 cut()
【发布时间】:2013-12-23 15:06:12
【问题描述】:

我正在尝试使用 ggplot2 绘制一个直方图,该直方图对于不同的 x 间隔具有不同的颜色条。

在参考了Hadley在how to define fill colours in ggplot histogram?中的解决方案后,我得出了以下结论:

library(ggplot2)

set.seed(1)
a <- seq(from=1, to=10000)
b <- rnorm(10000)
c <- data.frame(a,b) # Convert to DF

ggplot(c, aes(x=b, fill=cut(..x.., breaks=c(-2, -1, -0.5, 0, 0.5, 1, 2)))) +
  geom_histogram(binwidth=0.1, color="steelblue")

但是,当我尝试将断点定义为变量 MyBreaks 以传递给 aes() 时,出现错误:“cut.default(x,breaks = MyBreaks) 中的错误:对象‘MyBreaks’没找到。”

产生错误的代码:

MyBreaks <- c(-2, -1, -0.5, 0, 0.5, 1, 2)
ggplot(c, aes(x=b, fill=cut(..x.., breaks=MyBreaks))) +
  geom_histogram(binwidth=0.1, color="steelblue")

我对其他用户遇到的类似错误进行了一些研究,但解决方案似乎对我不起作用。

例如,How to use earlier declared variables within aes in ggplot with special operators (..count.., etc.) 中的解决方案给出了:“错误:美学的长度必须为 1,或者与 dataProblems:MyBreaks 的长度相同”。我的代码是:

ggplot(c, aes(x=b, MyBreaks1=MyBreaks, fill=cut(..x.., breaks=MyBreaks1))) +
  geom_histogram(binwidth=0.1, color="steelblue")

然后我尝试了Local Variables Within aes 中的解决方案,但这给出了相同的结果:“cut.default(x,breaks = MyBreaks) 中的错误:找不到对象'MyBreaks'”。我的代码是:

.e <- environment()
ggplot(c, aes(x=b, fill=cut(..x.., breaks=MyBreaks)), environment = .e) +
  geom_histogram(binwidth=0.1, color="steelblue")

我以前做过基本的编程,但是 R 的学习曲线真的很陡!如果有人可以提供帮助将不胜感激!

提前致谢!

【问题讨论】:

    标签: r ggplot2 cut


    【解决方案1】:

    这是来自 Roland 的评论How to use earlier declared variables within aes in ggplot with special operators (..count.., etc.)

    ggplot(c, aes(x=b, fill=cut(..x.., breaks=get("MyBreaks", envir=.GlobalEnv)))) +
    geom_histogram(binwidth=0.1, color="steelblue")
    

    【讨论】:

    • 感谢您的快速回复,@Jake!这行得通,但是您能解释一下为什么在这种情况下选择的解决方案对我不起作用吗?如果太繁琐,请附上网址,我去看看。
    • @NoviceProg 除了错误消息之外,我真的无法为您提供更多信息。传递给aes 的参数的长度必须为 1 或与数据的长度相同。在链接中,k 只是一个数字,所以它的长度为 1。您可以挖掘 ggplot2 源代码以找出为什么存在长度限制
    • 没问题,@Jake,你已经帮了大忙了!我刚开始使用 R 语言一个月,就已经被它的复杂性弄得不知所措。在这一点上,“为什么”仅次于“如何”和“什么”。让我们看看是否还有其他解决方案。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-05-22
    • 2020-09-14
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2020-01-24
    相关资源
    最近更新 更多