使用R中的ggplot2创建两个变量的定向箭头图

使用R中的ggplot2创建两个变量的定向箭头图,r,ggplot2,R,Ggplot2,我在两个时间点(timepoint)对同一受试者(id)测量了两个变量(V1,V2))。我想要一个带有箭头路径的散点图,以显示同一主题的值是如何从T1移动到T2的 在我的例子中,一些受试者在V1和V2中没有变化,理想的情况是,对于那些sub(例如sub 1),只显示一个点,但我同意两次访问两个点,因为它们会重叠。还有一些sub在V1或V2中降低(例如sub 2),这些sub显示在上面的红色箭头中。第三组受试者的V1或V2(第6组和第7组):这些子组呈绿色 然而,我真正需要的是所有箭头都指向T1到

我在两个时间点(
timepoint
)对同一受试者(
id
)测量了两个变量
(V1,V2)
)。我想要一个带有箭头路径的散点图,以显示同一主题的值是如何从
T1
移动到
T2

在我的例子中,一些受试者在
V1
V2
中没有变化,理想的情况是,对于那些sub(例如sub 1),只显示一个点,但我同意两次访问两个点,因为它们会重叠。还有一些sub在
V1
V2
中降低(例如sub 2),这些sub显示在上面的红色箭头中。第三组受试者的
V1
V2
(第6组和第7组):这些子组呈绿色

然而,我真正需要的是所有箭头都指向
T1
T2
。这就是我希望绿色箭头改变方向。

数据集可以通过以下方式生成:

datatest <- data.frame(timepoint =rep(seq(2,1),8), 
                   id = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8),
                   V1= c( 30.29, 30.29, 21.60, 31.43, 20.75,20.75, 21.60, 30.03, 21.60, 31.30, 31.60, 21.72, 31.6, 20.02, 11.60, 20.16),
                   V2=c(40, 40, 30.78, 41.63, 40.41, 40.41,30.78, 40.97, 20.78, 40.84, 41.85, 41.85, 40.78, 31.79,20.78, 30.23))
要生成我当前拥有的(错误)绘图,请运行以下代码:

library(ggplot2)
library(lemon)
ggplot(datatest, aes(V1,V2,color=as.factor(timepoint),group=id)) +ggtitle("V2 vs V1 from T1 to T2")+
  geom_pointline(linesize=1, size=2, distance=4, arrow = arrow(angle = 30, length = unit(0.1, "inches"), ends = "first", type = "open") )+
  scale_x_continuous(limits = c(0,33), breaks=seq(0,30,10), expand = c(0, 0)) +
  scale_y_continuous(limits = c(0,43), breaks=seq(0,44,10),expand = c(0, 0))+
  scale_color_manual(values=c("green","red"))+labs(color  = "Timepoint")
当前的绘图如下所示:


谢谢大家!

这会让你更靠近吗

library(dplyr)
library(tidyr)
library(ggplot2)


data <- data.frame(timepoint =rep(seq(2,1),8), 
                       id = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8),
                       V1= c( 30.29, 30.29, 21.60, 31.43, 20.75,20.75, 21.60, 30.03, 21.60, 31.30, 31.60, 21.72, 31.6, 20.02, 11.60, 20.16),
                       V2=c(40, 40, 30.78, 41.63, 40.41, 40.41,30.78, 40.97, 20.78, 40.84, 41.85, 41.85, 40.78, 31.79,20.78, 30.23))


data <- data %>%
  mutate(row_id = paste0("T", timepoint)) %>%
  pivot_wider(id_cols = id,
              names_from = row_id,
              values_from = c(V1, V2)) %>%
  mutate(colour = ifelse((V1_T1 > V1_T2) | (V2_T1 > V2_T2), "red", "green"))

ggplot(data = data) +
  geom_point(aes(x = V1_T1, y = V2_T1)) +
  geom_point(aes(x = V1_T2, y = V2_T2)) +
  geom_segment(aes(x = V1_T1, xend = V1_T2, y = V2_T1 , yend = V2_T2, colour = colour),
               arrow = arrow(length = unit(0.3,"cm"))) +
  scale_x_continuous(
    limits = c(0, 33),
    breaks = seq(0, 30, 10),
    expand = c(0, 0)
  ) +
  scale_y_continuous(
    limits = c(0, 43),
    breaks = seq(0, 44, 10),
    expand = c(0, 0)
  ) 
库(dplyr)
图书馆(tidyr)
图书馆(GG2)
数据%
枢轴更宽(id\U cols=id,
name\u from=行\u id,
值_from=c(V1,V2))%>%
变异(颜色=ifelse((V1_T1>V1_T2);(V2_T1>V2_T2),“红色”、“绿色”))
ggplot(数据=数据)+
几何点(aes(x=V1\UT1,y=V2\UT1))+
几何点(aes(x=V1\UT2,y=V2\UT2))+
geom_段(aes(x=V1_T1,xend=V1_T2,y=V2_T1,yend=V2_T2,color=color),
箭头=箭头(长度=单位(0.3,“厘米”))+
比例x连续(
极限=c(0,33),
中断=顺序(0,30,10),
expand=c(0,0)
) +
连续缩放(
极限=c(0,43),
中断=顺序(0,44,10),
expand=c(0,0)
) 
您可以过滤对象
数据
,以删除V1和V2不变的线,并且不绘制长度为零的线


非常感谢您的帮助!
library(dplyr)
library(tidyr)
library(ggplot2)


data <- data.frame(timepoint =rep(seq(2,1),8), 
                       id = c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8),
                       V1= c( 30.29, 30.29, 21.60, 31.43, 20.75,20.75, 21.60, 30.03, 21.60, 31.30, 31.60, 21.72, 31.6, 20.02, 11.60, 20.16),
                       V2=c(40, 40, 30.78, 41.63, 40.41, 40.41,30.78, 40.97, 20.78, 40.84, 41.85, 41.85, 40.78, 31.79,20.78, 30.23))


data <- data %>%
  mutate(row_id = paste0("T", timepoint)) %>%
  pivot_wider(id_cols = id,
              names_from = row_id,
              values_from = c(V1, V2)) %>%
  mutate(colour = ifelse((V1_T1 > V1_T2) | (V2_T1 > V2_T2), "red", "green"))

ggplot(data = data) +
  geom_point(aes(x = V1_T1, y = V2_T1)) +
  geom_point(aes(x = V1_T2, y = V2_T2)) +
  geom_segment(aes(x = V1_T1, xend = V1_T2, y = V2_T1 , yend = V2_T2, colour = colour),
               arrow = arrow(length = unit(0.3,"cm"))) +
  scale_x_continuous(
    limits = c(0, 33),
    breaks = seq(0, 30, 10),
    expand = c(0, 0)
  ) +
  scale_y_continuous(
    limits = c(0, 43),
    breaks = seq(0, 44, 10),
    expand = c(0, 0)
  )