这是我使用虚构数据得出的。感谢您分享您的数据结构,但将来最好分享数据本身,这可以通过控制台中的dput(your.data.frame) 完成,然后将输出作为代码复制/粘贴到问题中......或只需使用代码创建一个虚拟集,这就是我在这里所做的。
虚拟数据
library(tidyr)
library(dplyr)
library(ggplot2)
raw_df <- data.frame(
id=1:60,
c0sen=rnorm(60, 7, 0.2),
c4sen=rnorm(60, 8.5, 0.5),
c8sen=rnorm(60, 11, 1.2),
c0mot=rnorm(60, 6, 0.3),
c4mot=rnorm(60, 7.5, 0.5),
c8mot=rnorm(60, 9.6, 0.8),
c0aut=rnorm(60, 3, 0.1),
c4aut=rnorm(60, 2.9, 0.1),
c8aut=rnorm(60, 3.5, 0.8)
)
处理数据
在继续绘图之前,您需要准备数据集以使用ggplot2 进行绘图。与Tidyverse 中的其他包一样,您应该准备好您的数据以跟随Tidy Data Principles,这就是我将在这里使用tidyr 和dplyr 包所做的。
您按原样排列的数据有很多相同的信息分散到我们需要gather() 一起的多个列中,但在每列中还有我们需要separate() 分开的多条信息(时间和类型测量)。
第一步是将数据收集为“长”格式,其中有一列用于measure(c0aut、c8mot 等),一列用于score,同时保持@ 987654334@专栏。然后我们需要将measure 列分成两列:一列描述time,另一列描述测量的type。
df <- raw_df %>%
gather(key='measure', value='score', -id) %>%
separate(col=measure, into=c('c_time','type'), sep=2)
最后,我想修复c_time,只给我号码,我们可以这样做:
df <- df %>% separate(c_time, into=c('c', 'time'), sep=1) %>%
select(-c)
现在,应该注意 df$time 实际上是一个字符向量(不是数值)...但这实际上没关系,因为我们希望 ggplot2 将其视为序数因子,而不是一个数值,因为在 x 轴上,我们希望 0、4 和 8 均匀分布。
绘制数据
既然你提到这对你来说是新的,我将把情节代码分解成几部分,以便按照创建情节所采取的步骤非常容易。首先,我们从基础开始,我们设置数据框以及自始至终使用的通用美学。请注意,color= 映射到类型,group= 也是如此。这是必要的,以便ggplot2 知道数据也应该根据类型进行分组(而不是将数据集作为一个整体)。这对于我们将要绘制的几何图形非常重要。
p <- ggplot(df, aes(x=time, y=score, color=type, group=type))
统计数据和几何。
然后,我们通过 3 次调用 stat_summary 在绘图区域上绘制数据,绘制线、误差线和点(按此顺序)。误差线是使用均值 +/- 标准误差(“mean_se”)绘制的,当然也可以使用其他函数。我们还必须用错误栏覆盖color= 美学,因为我们希望它们都是黑色的(而不是根据类型着色),我们必须将shape= 美学添加到点以便我们可以映射它键入以匹配您的情节。
p <- p + stat_summary(
geom='line', fun=mean) +
stat_summary(
geom='errorbar', fun.data=mean_se,
color='black', width=0.1) +
stat_summary(
geom='point', fun=mean, aes(shape=type))
天平。
对于比例尺,我通过重命名 "0", "4", "8" 轴来设置 x 轴属性,并且我还将扩展设置为不扩展为默认值,因为它看起来更好一些。 scale_color 和 scale_shape 调用很重要,必须同时更改以保持一致,否则您将失去两个刻度之间的连接,ggplot2 实际上会显示两个单独的刻度。
type_labels <- c('Autonomic', 'Motor', 'Sensory')
p <- p + scale_x_discrete(
name=NULL, labels=c('Baseline', '4 weeks', '8 weeks'),
expand=expansion(mult=0.05)) +
scale_color_manual(name=NULL, labels=type_labels, values=rainbow(3)) +
scale_shape_discrete(name=NULL, labels=type_labels)
主题元素。
最后,我设置了主题元素,包括命名、保持theme_bw() 的整体简洁外观以及在图例周围添加框,我将其放置在底部。
p <- p + labs(
title='EORTC QLQ-CIPN20',
y='Symptom Score'
) +
theme_bw() +
theme(
legend.position='bottom',
legend.title=element_blank(),
legend.background = element_rect(color='black')
)
p
这一切都为您提供了以下内容: