r - 如何在具有不同 x 范围和因子的 ggplot 中使用 stat_function?
问题描述
我在编写 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 行,这样做会很乏味。而且我不知道如何编写这段代码。
这就是我呼救的原因。有什么想法可以做我想做的吗?预先感谢您的帮助!
解决方案
这是一个好的开始:
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
美学,器官和年龄各一个,而不是将这两个变量都映射到颜色。
推荐阅读
- html - 溢出-x:隐藏在移动视图中不起作用
- python - 从字符串中,如何在 rgb 之后的括号之间提取值?
- html - 网站在服务器上看起来比在本地主机上更大
- flutter - 如何设置垂直滚动角度设置
- java - Java Spring Boot - JPA:StackOverflowError 与 @ManyToMany 关系
- python - 从 numpy where() 转换数据
- reactjs - React POST 请求是在没有 cookie 的情况下发送的
- python - 在 python 中比较两个图像时,我想获得 SSIM
- go - Golang:忽略标志参数的位置
- c - 如果元素出现超过 n 次,则删除该元素的出现 - realloc():下一个大小无效