Проведите линию связи между несколькими точками данных по группам. - PullRequest
0 голосов
/ 06 мая 2019

В моем корреляционном ggplot я хотел бы добавить несколько дополнительных «линий мини-регрессии» между несколькими парами точек данных.

У меня есть 10 видов, которые наблюдались дважды (в 2010 и 2014 годах),

set.seed(42)
obs_2010 <- runif(10, min=1, max=20)
obs_2014 <- runif(10, min=1, max=20)
species <- c("A","B","C","D","E","F","G","H","I","L")
DF <- data.frame(species, obs_2010, obs_2014, stringsAsFactors=T)

Я построил графики значений 2010 года по сравнению со значениями 2014 года и получил график корреляции.https://i.stack.imgur.com/W8fM3.jpg

Некоторые из этих видов являются родственными видами (скажем, AL, BI, GH).В дополнение к линии регрессии, основанной на всех 10 видах, я хотел бы нарисовать линию между точками A и L, еще одну линию между B и I, другую между G и H. По сути, я хотел бы получить этот график (теперь сделанос краской;)) https://i.stack.imgur.com/9uXEQ.png

Вот несколько неудачных испытаний, которые я сделал:

#pairs to connect: A-L, B-I, G-H
sister=c(1,2,NA,NA,NA,NA,3,3,2,1)

sistasp <- data.frame(species=DF$species,sister=sister, stringsAsFactors=T)

#trial1
ggplot(DF, aes(x=obs_2010, y=obs_2014)) + 
  geom_point(aes(col=species), shape=16, size=3) + theme_bw() + xlim(0,20) + ylim(0,20) +
  geom_smooth(method=glm, se=F, col="black") +   
  geom_line(aes(group=sister), na.rm=T)
#almost good, but also points with NA (those without sister species) are connected

#trial2
ggplot(DF, aes(x=obs_2010, y=obs_2014)) + 
  geom_point(aes(col=species), shape=16, size=3) + theme_bw() + xlim(0,20) + ylim(0,20) +
  geom_smooth(method=glm, se=F, col="black") +  
  geom_segment(data = merge(DF, sistasp, by = "sister"), 
             aes(x=y2010.x, xend=y2010.y, y=y2014.x, yend=y2014.y))
#error message Error in FUN(X[[i]], ...) : object 'y2010.x' not found

Спасибо за вашу помощь =)

1 Ответ

0 голосов
/ 06 мая 2019

Так что я думаю, что ваш первый метод был почти верным, но вы могли бы захотеть поместить данные, которые вы передаете, в geom_line(), просто в данные, которые содержат сестринскую информацию.Я добавил $sister к DF, чтобы группировка соответствовала данным.

DF$sister <- sister

ggplot(DF, aes(x=obs_2010, y=obs_2014)) + 
  geom_point(aes(col=species), shape=16, size=3) + theme_bw() + xlim(0,20) + ylim(0,20) +
  geom_smooth(method=glm, se=F, col="black") +   
  geom_line(data = DF[!is.na(sister),], aes(group=sister), na.rm=T)

Это дает вам то, что вы хотите?

...