R “如何绘制图形”;“之前和之后”;使用带有连接线和子集的ggplot进行测量?

R “如何绘制图形”;“之前和之后”;使用带有连接线和子集的ggplot进行测量?,r,ggplot2,scatter-plot,R,Ggplot2,Scatter Plot,我对ggplot完全陌生,对R比较熟悉,我想制作一个扣人心弦的带有连接线的“前后”散点图,以说明在特殊训练计划前后不同分组的百分比变化。我尝试了一些选择,但尚未: 单独显示每个观察值(现在相同的值重叠) 将相关的前后测量值(x=0和x=1)与线连接起来,以更清楚地说明变化方向 使用形状和颜色沿类和id子集数据 如何最好地使用ggplot(或其他)创建散点图,以满足上述要求 主要备选方案:geom_point() 下面是一些使用genom_point的示例数据和示例代码 x <-

我对ggplot完全陌生,对R比较熟悉,我想制作一个扣人心弦的带有连接线的“前后”散点图,以说明在特殊训练计划前后不同分组的百分比变化。我尝试了一些选择,但尚未:

  • 单独显示每个观察值(现在相同的值重叠)
  • 将相关的前后测量值(x=0和x=1)与线连接起来,以更清楚地说明变化方向
  • 使用形状和颜色沿类和id子集数据
如何最好地使用ggplot(或其他)创建散点图,以满足上述要求

主要备选方案:geom_point() 下面是一些使用genom_point的示例数据和示例代码

    x <- c(0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1) # 0=before, 1=after
    y <- c(45,30,10,40,10,NA,30,80,80,NA,95,NA,90,NA,90,70,10,80,98,95) # percentage of ”feelings of peace"
    class <- c(0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1) # 0=multiple days 1=one day
    id <- c(1,1,2,3,4,4,4,4,5,6,1,1,2,3,4,4,4,4,5,6) # id = per individual

    df <- data.frame(x,y,class,id)

    ggplot(df, aes(x=x, y=y), fill=id, shape=class) + geom_point()

备选方案:geom_点图() 我还探索了geom_dotplot(),以澄清使用genom_point()时产生的重叠观测,正如我在下面的示例中所做的那样,但是我还不了解如何将前后测量合并到同一个图中

    df1 <- df[1:10,] # data before
    df2 <- df[11:20,] # data after

    p1 <- ggplot(df1, aes(x=x, y=y)) +
      geom_dotplot(binaxis = "y", stackdir = "center",stackratio=2,
           binwidth=(1/0.3))

    p2 <- ggplot(df2, aes(x=x, y=y)) +
      geom_dotplot(binaxis = "y", stackdir = "center",stackratio=2,
           binwidth=(1/0.3))

    grid.arrange(p1,p2, nrow=1) # GridExtra package

df1这里有一个可能的解决方案

首先-要获得由变量确定的颜色和形状,需要将它们放入
aes
函数中。我将几个因子转换成了factor,因此
labs
函数修复了标签,使它们不显示为“factor(x)”,而只显示为“x”

要解决多个问题,一种解决方案是使用
geom_smooth
method=“lm”
。这将绘制回归线,而不是连接所有点。 选项
se=FALSE
可防止绘制置信区间-我认为它们不会给您的绘图增加很多内容,但可以使用它。 连接点是通过
geom_line
完成的-也可以随意尝试

geom_point
内,选项
position=position_jitter(width=.1)
向x轴添加随机噪声,使点不会重叠

ggplot(df, aes(x=factor(x), y=y, color=factor(id), shape=factor(class), group = id)) + 
  geom_point(position = position_jitter(width = .1)) + 
  geom_smooth(method = 'lm', se = FALSE) + 
  labs(
    x = "x",
    color = "ID",
    shape = 'Class'
  )

这里有一个可能的解决方案

首先-要获得由变量确定的颜色和形状,需要将它们放入
aes
函数中。我将几个因子转换成了factor,因此
labs
函数修复了标签,使它们不显示为“factor(x)”,而只显示为“x”

要解决多个问题,一种解决方案是使用
geom_smooth
method=“lm”
。这将绘制回归线,而不是连接所有点。 选项
se=FALSE
可防止绘制置信区间-我认为它们不会给您的绘图增加很多内容,但可以使用它。 连接点是通过
geom_line
完成的-也可以随意尝试

geom_point
内,选项
position=position_jitter(width=.1)
向x轴添加随机噪声,使点不会重叠

ggplot(df, aes(x=factor(x), y=y, color=factor(id), shape=factor(class), group = id)) + 
  geom_point(position = position_jitter(width = .1)) + 
  geom_smooth(method = 'lm', se = FALSE) + 
  labs(
    x = "x",
    color = "ID",
    shape = 'Class'
  )

或者,最好通过
x
id
class
作为
y
平均值
/
中值
,过滤掉产生
NA
s的
id
s3和6)的
id
s,并用线连接点?因此,如果您真的不需要显示某些
id
s的可变性(如果绘图仅显示趋势,则可能是真的),您可以这样做:

library(ggplot)
library(dplyr)
#library(ggthemes)

df <- df %>%
  group_by(x, id, class) %>%
  summarize(y = median(y, na.rm = T)) %>%
  ungroup() %>%
  mutate(
    id = factor(id),
    x = factor(x, labels = c("before", "after")),
    class = factor(class, labels = c("one day", "multiple days")),
    ) %>%
  group_by(id) %>%
  mutate(nas = any(is.na(y))) %>%
  ungroup() %>%
  filter(!nas) %>%
  select(-nas)

ggplot(df, aes(x = x, y = y, col = id, group = id)) +
  geom_point(aes(shape = class)) +
  geom_line(show.legend = F) +
  #theme_few() +
  #theme(legend.position = "none") +
  ylab("Feelings of peace, %") +
  xlab("")
库(ggplot)
图书馆(dplyr)
#图书馆(主题)
df%
分组依据(x,id,类别)%>%
汇总(y=中位数(y,na.rm=T))%>%
解组()%>%
变异(
id=系数(id),
x=系数(x,标签=c(“之前”、“之后”),
类别=系数(类别、标签=c(“一天”、“多天”),
) %>%
分组依据(id)%>%
变异(nas=any(is.na(y)))%>%
解组()%>%
筛选器(!nas)%%>%
选择(-nas)
ggplot(df,aes(x=x,y=y,col=id,group=id))+
几何点(aes(形状=类别))+
几何图形线(show.legend=F)+
#主题()+
#主题(legend.position=“无”)+
伊拉布(“和平的感觉,%”)+
xlab(“”)

或者最好通过
x
id
class
将数据汇总为
y
平均值
/
中值
,过滤掉产生
NA
s的
id
s3和6),并用线连接点?因此,如果您真的不需要显示某些
id
s的可变性(如果绘图仅显示趋势,则可能是真的),您可以这样做:

library(ggplot)
library(dplyr)
#library(ggthemes)

df <- df %>%
  group_by(x, id, class) %>%
  summarize(y = median(y, na.rm = T)) %>%
  ungroup() %>%
  mutate(
    id = factor(id),
    x = factor(x, labels = c("before", "after")),
    class = factor(class, labels = c("one day", "multiple days")),
    ) %>%
  group_by(id) %>%
  mutate(nas = any(is.na(y))) %>%
  ungroup() %>%
  filter(!nas) %>%
  select(-nas)

ggplot(df, aes(x = x, y = y, col = id, group = id)) +
  geom_point(aes(shape = class)) +
  geom_line(show.legend = F) +
  #theme_few() +
  #theme(legend.position = "none") +
  ylab("Feelings of peace, %") +
  xlab("")
库(ggplot)
图书馆(dplyr)
#图书馆(主题)
df%
分组依据(x,id,类别)%>%
汇总(y=中位数(y,na.rm=T))%>%
解组()%>%
变异(
id=系数(id),
x=系数(x,标签=c(“之前”、“之后”),
类别=系数(类别、标签=c(“一天”、“多天”),
) %>%
分组依据(id)%>%
变异(nas=any(is.na(y)))%>%
解组()%>%
筛选器(!nas)%%>%
选择(-nas)
ggplot(df,aes(x=x,y=y,col=id,group=id))+
几何点(aes(形状=类别))+
几何图形线(show.legend=F)+
#主题()+
#主题(legend.position=“无”)+
伊拉布(“和平的感觉,%”)+
xlab(“”)

在特定时间有多个值的点/人(即,在时间零点有两个id为“1”的点/人)。我认为最好先弄清楚你想要什么类型的图表,然后人们可以帮助你建立它。在这种情况下,slopegraph可能会很好地工作,并且很容易在中实现ggplot@wibeasley是的,这是有意的,稍后我将对此参数进行子集设置。谢谢你指出这个不明确的地方@卡米尔谢谢你慷慨的天才!我已经完全忘记了斜坡图,我认为你完全正确,这是我应该拥有的数据。我们将进一步探索,让你们都知道进展如何。在此之前,再次感谢!在特定时间有多个值的点/人(即,在时间零点有两个'1'的
id
s)。是th吗