R 将带有坡度和误差的箭头添加到几何点图中
我有来自两组的R 将带有坡度和误差的箭头添加到几何点图中,r,ggplot2,polygon,arrows,R,Ggplot2,Polygon,Arrows,我有来自两组的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:
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))
我正在寻找一种只使用两个箭头绘制点的方法,每组一个。
箭头将从每组的质心开始,具有一个坡度,即每组的中间坡度。理想情况下,箭头还将具有每个组作为多边形的中间坡度的标准误差
以下是我目前正在做的事情:
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))
但我用的是别的东西
因此,绘制此图:
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)
给出:
如果有更好的方法,以及如何添加标准误差多边形,有什么建议吗?计算每个周期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
谢谢@Wimpel。这很接近,但不会给出实际的标准误差多边形。@这是因为您只有两个中心(每个簇)。。。所以没有错误:)我指的是通过平均每个点的箭头斜率计算出的错误:(
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)
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
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 )