【问题标题】:Layered scatterplot with spline for means带样条线的分层散点图
【发布时间】:2015-07-13 00:33:22
【问题描述】:

我正在尝试用散点图和一条平滑线显示一系列天数的动物行为,用颜色编码的散点图和平滑线显示点上的平均值。我最接近的是使用这样的格子,其中“站立”是我正在查看的特定行为:

xyplot(data=data2, 
       Standing ~ Day, 
       type = c("p", "spline"))

这看起来不错,但不能区分点。如果我尝试使用 group = Sheep 它也会划分线。我不知道如何分组一个但不是另一个。

我也尝试过使用 ggplot2,但 geo_smooth() 似乎没有给我想要的那种线条,并且以下代码不起作用。

means <- tapply(data3$Standing, data3$Day, mean)
ggplot(data3, aes(x = Day, y = Standing)) + 
  geom_point(aes(colour = Sheep)) +   
  geom_line(data = data.frame(spline(means)))

我的数据集如下所示:

   Sheep Day Block Standing Lying Eating Ruminating Moving Fence Pawing Social Scratching
1      2  -4     0       49    12     36         16      0     0      1      0          0
12     4  -4     0       46    13     32         15      0     2      0      0          0
23     5  -4     0       48    13     32         22      0     0      0      0          0
34     6  -4     0       48    12     36         17      0     0      0      0          0
45     2  -3     0       45    19     39         20      2     0      1      0          0
56     4  -3     0       30    27     35         24      6     4      0      0          0

【问题讨论】:

    标签: r grouping scatter-plot spline


    【解决方案1】:

    ggplot 中查看stat_smooth,我认为这就是您所追求的。

    您无需事先计算means,因为stat_smooth 应该为您计算。如果你想使用样条线,有一个spline example here

    在此示例中它不是很有帮助,但根据您的数据集,我可以生成以下图表:

    ggplot(data2, aes(x=Day, y=Standing, color=Sheep)) + 
      geom_point() + 
      stat_smooth(method=lm)
    

    library(splines)
    ggplot(data2, aes(x=Day, y=Standing, color=Sheep)) + 
      geom_point() + 
      stat_smooth(method=lm, formula=y~ns(x,3))
    

    【讨论】:

      【解决方案2】:

      我是否正确理解您只想将单个动物的值显示为点,并且您希望线条总结所有动物的趋势?

      如果是这样,那么您需要将绘图分为两个步骤:一个是生成按组着色的散点图,另一个是计算每日均值并将它们添加到原始散点图的连线。

      对于第一步,如果您将分组变量指定为颜色调用中的一个因素,您可以使用基础 R 中的 plot() 按组(绵羊)获取颜色。所以:

       with(data2, plot(Standing ~ Day, type = "p", pch=20, col=as.factor(Sheep)))
      

      要添加一条按天连接各组均值的线,请使用tapply() 计算Standing by Day 的均值,使用spline()lowess() 连接点,使用lines() 将其添加到现有的第一步创建的情节。这是使用lowess()的版本:

       with(data2, lines(lowess(tapply(Standing, Day, mean)), lwd=2))
      

      我使用此行生成播放数据以确认此方法有效:

      data2 <- data.frame(Sheep = c(rep(1,7), rep(2,7), rep(3,7), rep(4,7)),
        Standing = rnorm(n = 4 * 7, mean = 45, sd = 5),
        Day = rep(seq(7),4))
      

      【讨论】:

      • 您好,感谢您的回复。你明白我的意思,但我似乎无法让你的代码工作。散点图将显示,但该线未添加到顶部。我收到一条错误消息,提示“尚未调用 plot.new”。我以前从未使用过 with() 函数,所以也许我做错了什么。
      • 啊,我明白你的意思了。这个问题似乎是xyplot() 特有的,我不知道该功能或“格”足以知道如何解决它。但是,如果您只使用plot() 版本,它应该可以正常工作。所以,with(data2, plot(Standing ~ Day, type = "p", col = as.factor(Sheep))) 后跟 with(data2, lines(spline(tapply(Standing, Day, mean))))。我还发现我对 loess() 的建议没有按预期工作,因此我将编辑我的原始答案以仅保留有效的版本。
      • 这确实有效,但由于某种原因,当点的位置正确时,线从 0 而不是从 -4 开始。所以他们不对应。如果我尝试自己绘制均值也是一样的,即使生成的值肯定以 -4 的均值开头。我一直在想,在 ggplot2 中一定有一种我还没想出来的方法。
      • 在基础 R 中,您可以自定义轴,包括标签,方法是在对 plot() 的原始调用中指定 axes = FALSE,然后使用 axis() 就像您在此处添加 'lines()具有所需标签等的新版本。因此,例如,如果您想要从 -4 开始的 x 轴标签,您可以执行 axis(1, at=seq(7), labels=seq(-4,2,1)) 之类的操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2016-04-17
      • 1970-01-01
      • 2012-10-13
      • 2022-01-08
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多