0

我在编写 ggplot 时遇到问题。我有这种数据集,关于与身体长度相关的器官大小(以 x 为单位):

Species <- c("dog","dog","dog","dog","cat","cat","cat","cat")
CatAge <- c("young","young", "old","old", "young","young", "old","old" )
Organ <- c("Head", "Tail", "Head", "Tail","Head", "Tail","Head", "Tail")
a0 <- c(2.98962815, 0.53920924, 1.51232011, 0.32431237, 1.63165924, 0.1801883, 2.18294768, 0.10224673)
a1 <- c(-0.123974545, 0.013143765, 1.261783376, 0.290707994, 1.366204115, -0.009038363, 0.60089694, 0.265277471)
xmin <- c(0.9334873, 0.9334873, 1.1205739, 1.1205739, 0.5250448, 0.5250448, 0.6599162, 0.6599162)
xmax <- c(1.0629578, 1.0629578,1.2193225,1.2193225, 0.6946052, 0.6946052, 0.8331471, 0.8331471 )


MyData <-  data.frame(Species, CatAge, Organ, a0, a1, xmin, xmax)

Species 是考虑的物种,CatAge 是年龄类别,Organ 是测量器官,a0 和 a1 是公式 a0+a1*x 中的系数,xmin 和 xmax 是体长,它们是线性回归的极限

(注意:这是一个完全不切实际的数据集,但我的数据集具有类似的结构:物种、幼虫龄、测量器官以及系数和限制)

我想要的是这种类型的图(老动物的红色/棕色头/尾,年轻动物的蓝色/绿色头/尾): 我想要的是

基本上,我只想告诉 ggplot:在正确的面板中使用 a0 和 a1,在 xmin 和 xmax 的范围内绘制线性回归,并根据器官/CatAge 组合应用颜色。

所以我虽然有这样的代码

 ggplot(data=MyData, aes(group=Species))+
facet_wrap(~Species)+
stat_function(data= MyData, fun=function(x){a0+a1*x}, xlim=c(xmin, xmax) )

当然,没有奏效。在我的尝试中,我收到了许多错误消息:尝试应用非函数,xmin 和 xmax 未知,美学必须是长度 1 或与数据相同 (18):x 等

我什至考虑通过一个循环“for”来逐行考虑数据集,比如

g+ stat_function(data = MyData[i,], xlim=c(MyData[i,]$xmin, MyData[i,]$xmax), fun=function(x){MyData[i,]$a0+MyData[i,]$a1*x} )

好吧,它也失败了。

我可能会尝试为每个组合逐行手动编写,例如:

stat_function(data = MyData[(MyData$Species=="dog"),], fun=function(x){0.02540 + 0.03751 *x}, xlim=c(0.9334873, 1.0629578), colour="black", size=1, linetype=6) 

但是 1)我什至不确定它是否会起作用 2)我的真实数据集有 3 个物种、3 个器官、5 到 7 个阶段和 57 行,这样做会很乏味。而且我不知道如何编写这段代码。

这就是我呼救的原因。有什么想法可以做我想做的吗?预先感谢您的帮助!

4

1 回答 1

4

这是一个好的开始:

ggplot(MyData, aes(color = interaction(Organ, CatAge, sep = " / "))) +
  geom_segment(aes(
      x    = xmin,    y = a0 + a1 * xmin,
      xend = xmax, yend = a0 + a1 * xmax), 
    size = 1.5) +
  facet_wrap(~Species) +
  labs(x = "Body Length", y = "Organ Length", color = "Organ / Age")

在此处输入图像描述

您可能需要考虑使用linetype color美学,器官和年龄各一个,而不是将这两个变量都映射到颜色。

于 2020-02-06T15:27:31.107 回答