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