首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在一条线图中绘制多个组的配对均值?

如何在一条线图中绘制多个组的配对均值?
EN

Stack Overflow用户
提问于 2020-07-02 15:29:10
回答 1查看 593关注 0票数 0

我还在学习R代码,所以这个问题可能很简单,但我就是搞不懂。

我想在三个不同的时间点上用置信区间来绘制平均分数:基线时,治疗后4个周期,治疗8个周期后。问卷包括感觉量表、运动量表和自主量表。所以我想画出每个时间点三个不同尺度的平均分数。所以我想要一个线图,在X轴上,时间点(基线,4个周期后,8个周期之后),在Y轴上,我想要分数,这个图表必须包含三个不同的颜色线,表示感觉,运动和自主尺度。我想用ggplot。

我有一个包含以下列的dataframe:

  • ID ->,这是病人的ID (在我的数据中总共有60名病人)
  • 基线感觉量表的c0sen ->评分
  • 治疗4个周期后感觉量表的c4sen ->评分
  • 治疗8周期后感觉量表的c8sen ->评分
  • 运动基准量表的c0mot ->评分
  • 治疗4个周期后运动量表的c4mot ->评分
  • 治疗8周后运动量表的c8mot ->评分
  • 基线自主量表的c0aut ->评分
  • 治疗4个周期后自主神经功能评分的c4aut ->评分
  • c8aut ->评分在治疗8周后自主神经功能评分中的应用

这就是我想要的:

我希望有人能帮我!事先非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-07-02 16:28:05

这就是我想出的使用合成数据的方法。感谢您共享数据的结构,但是在将来最好是共享数据本身,这可以通过控制台中的dput(your.data.frame)完成,然后将输出复制/粘贴到问题中作为代码.或者使用代码创建一个虚拟集,这就是我在这里要做的。

虚拟数据

代码语言:javascript
运行
复制
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绘图的数据集。与来自蒂德弗斯的其他包一样,您应该准备好数据以遵循整齐数据原则,这就是我在这里使用tidyrdplyr包所做的工作。

您的数据按原样排列,有许多相同的信息分散到多个列中,我们需要将这些列合并在一起,但在每一列中也有我们需要分离的多个信息(时间和度量类型)。

第一步是将数据收集成“长”格式,其中有一个用于measure (c0aut、c8mot等)的列,一个用于score的列,同时维护id列。然后,我们需要将measure列分为两列:一列描述time,另一列描述度量的type

代码语言:javascript
运行
复制
df <- raw_df %>%
  gather(key='measure', value='score', -id) %>%
  separate(col=measure, into=c('c_time','type'), sep=2)

最后,我想修复c_time,只需给出数字,我们可以这样做:

代码语言:javascript
运行
复制
df <- df %>% separate(c_time, into=c('c', 'time'), sep=1) %>%
  select(-c)

现在,应该注意到,df$time实际上是一个字符向量(不是一个数值).但这实际上是可以的,因为我们希望ggplot2将其视为序数因子,而不是数值,因为在x轴上,我们希望0、4和8均匀地分布。

绘制数据

既然您提到了这对您来说是新的,我将把地块代码分解成几个部分,这样就可以很容易地按照创建这个图所采取的步骤进行操作。首先,我们从基础开始,在此基础上,我们设置了数据和通用美学。请注意,color=映射为类型,但group=也是如此。这是必要的,这样ggplot2就知道数据也应该按照类型进行分组(而不是将数据集作为一个整体)。这对我们将要画的几何画来说很重要。

代码语言:javascript
运行
复制
p <- ggplot(df, aes(x=time, y=score, color=type, group=type))

Stats和geoms。我们然后用3次对stat_summary的调用来绘制绘图区域上的数据,这些调用会绘制线条、错误条和点(按这个顺序)。错误条是使用均值+/-标准错误("mean_se")绘制的,当然也可以使用其他函数。我们还必须用错误条覆盖color=美学,因为我们希望它们都是黑色的(而不是按类型着色),并且我们必须将shape=美学添加到点中,这样我们就可以映射它以匹配您的情节。

代码语言:javascript
运行
复制
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))

scales .用于缩放,我通过重命名"0", "4", "8"轴来设置x轴属性,并且我还将扩展设置为不像默认的那样展开,因为它看起来要好一些。scale_colorscale_shape调用对于同时进行一致性的更改非常重要,否则您将断开两个标度之间的连接,而ggplot2实际上将显示两个不同的标度。

代码语言:javascript
运行
复制
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()的整体整洁外观,以及在图例周围添加框(位于底部)。

代码语言:javascript
运行
复制
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

这些都给了你以下几点:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62699881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档