Добавьте стрелку с уклоном и ошибкой на график geom_point - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть xy данные из двух групп, где каждая точка также имеет соответствующие xend и yend координаты, которые указывают, где заканчивается стрелка, начинающаяся в этой точке:

set.seed(1)
df <- data.frame(x=c(rnorm(50,-1,0.5),rnorm(50,1,0.5)),y=c(rnorm(50,-1,0.5),rnorm(50,1,0.5)),group=c(rep("A",50),rep("B",50)))
df$arrow.x.end <- c(df$x[1:50]+runif(50,0,0.25),df$x[51:100]-runif(50,0,0.25))
df$arrow.y.end <- c(df$y[1:50]+runif(50,0,0.25),df$y[51:100]-runif(50,0,0.25))

Стрелкигруппа A обычно указывает на группу B и наоборот:

library(ggplot2)
ggplot(df,aes(x=x,y=y,color=group))+geom_point()+theme_minimal()+
  geom_segment(aes(x=x,y=y,xend=arrow.x.end,yend=arrow.y.end),arrow=arrow())+
  theme(legend.position="none")

enter image description here

Я ищу способ нанесения точек только с двумя стрелкамипо одному на каждую группу.Стрелки начнутся с центроидов каждой группы и будут иметь наклон, который является медианным уклоном каждой группы.В идеале стрелки должны иметь стандартные ошибки среднего наклона каждой группы в виде полигонов.

Вот что я делаю до сих пор:

library(dplyr)
slope.df <- df %>%
  dplyr::group_by(group) %>%
  dplyr::mutate(slope=(arrow.y.end-y)/abs((arrow.x.end-x)),length=sqrt((arrow.y.end-y)^2+(arrow.x.end-x)^2)) %>%
  dplyr::summarise(slope.median=mean(slope),
                   slope.median.se=1.2533*(sd(slope)/sqrt(n())),
                   median.length=median(length),
                   x.start=median(x),y.start=median(y)) %>%
  dplyr::mutate(x.end=x.start+sign(slope.median)*(median.length/sqrt(2))) %>%
  dplyr::mutate(y.end=sign(slope.median)*((x.end-x.start)*slope.median))

Вычисление наклона каждой стрелки и еедлина.И затем для каждой группы средний уклон, стандартная ошибка среднего уклона и средняя длина.Прямо сейчас я вычисляю xend и yend медианной стрелки как:

median.length^2 <- xend^2 + xend^2 

Но я использую что-то еще.

Так что заговорю это:

ggplot(df,aes(x=x,y=y,color=group))+geom_point()+theme_minimal()+theme(legend.position="none")+
  geom_segment(aes(x=x.start,y=y.start,xend=x.end,yend=y.end),arrow=arrow(),data=slope.df)

Дает: enter image description here

Любой совет, если есть лучший способ сделать это, а также как добавить стандартный полигон ошибки?

1 Ответ

0 голосов
/ 05 декабря 2018

вычислите среднее значение x и y для каждого периода

df2 <- df %>% 
  select( -c(4,5) ) %>%
  mutate( period = 0 ) %>%
  rbind( data.frame( x = df$arrow.x.end,
                     y = df$arrow.y.end,
                     group = c( rep( "A", 50 ),rep( "B" , 50 ) ),
                     period = 1) 
         ) %>%
  group_by( group, period ) %>%
  summarise_all( mean )

# # A tibble: 4 x 4
# # Groups:   group [2]
#   group period      x      y
#   <fct>  <dbl>  <dbl>  <dbl>
# 1 A          0 -0.950 -1.08 
# 2 A          1 -0.816 -0.942
# 3 B          0  1.06   1.04 
# 4 B          1  0.940  0.905

график, используйте stat_smooth, чтобы нарисовать линию через «среднее» облаков

ggplot( data = df2, aes( x = x, y = y, colour = group ) ) + 
  stat_smooth(se = TRUE, method = lm, fullrange = TRUE) +
  geom_point( data = df, aes(x = x, y = y, colour = group, fill = group ) ) + 
  geom_point( data = df, aes(x = arrow.x.end, y = arrow.y.end, colour = group, fill = group), alpha = 0.5 )

enter image description here

...