【问题标题】:Add line crossing factors in dotplot (ggplot)在点图中添加线交叉因子(ggplot)
【发布时间】:2011-07-13 16:06:57
【问题描述】:

我正在尝试复制批次/病例/治疗的点图,其中线条与 ggplot 中的因素交叉。这类似于 Douglas Bates 的线性模型课程中的这个图,它在 y 轴上显示 6 个组,在 x 轴上显示连续响应,每个组的平均值由一条线连接:

以与 lme4 包捆绑的 sleepstudy 数据集为例,我有:

library(ggplot2)
p <- ggplot(sleepstudy, aes(x=Reaction, y=reorder(Subject, Reaction)))
p <- p + geom_point()
print(p)

这给出了基本的点图,y 轴上的主题按反应时间增加的顺序排列。

然后我创建一个数据框,其中包含每个主题的平均反应时间:

mean_rxn <- function(df) mean(df$Reaction, na.rm=T)
sleepsummary <- ddply(sleepstudy, .(Subject), mean_rxn)

我能够在每个主题的平均值上绘制点:

p.points <- p + geom_point(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), size=10))
print(p.points)

但我无法跨越这些因素。也就是说,从 geom_point 更改为 geom_line 什么都不显示

# does nothing
p.line <- p + geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1)))
print(p.line)

有人有什么想法吗?最终,我的目标是以这种方式在原始数据之上绘制一些模型结果,因此在原始数据帧的绘图中“即时”计算手段的方法不太有用,因为我需要从中获取数据点更复杂的模型拟合。

感谢您的帮助!

瑞恩

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    已编辑

    我的第一个建议是在绘图之前将值转换为数字。

    p.line <- p + 
      geom_line(data=sleepsummary, aes(x=V1, y=as.numeric(reorder(Subject, V1))))
    

    但 Hadley 指出,最好在解决方案中使用 group=1,而不是 as.numeric():

    p.line <- p + 
      geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), group=1))
    print(p.line)
    

    【讨论】:

    • 谢谢,哈德利。我已编辑答案以反映您的评论。
    【解决方案2】:

    你也可以像这样使用 stat_summary:

    require(lme4)
    require(ggplot2)
    
    data(sleepstudy)
    
    ggplot(sleepstudy, aes(x = reorder(Subject, Reaction), y = Reaction)) + 
    geom_point() + 
    stat_summary(fun.y = mean, geom = "line", aes(group = 1)) + 
    labs(x = "Subject", y = "Reaction") +
    coord_flip()
    

    【讨论】:

    • 谢谢!对于其他应用程序,我一定会牢记这一点。不幸的是,对于我的实际问题(不是这个例子),我需要绘制一些比 stat_summary 容易支持的内容更复杂的东西。
    猜你喜欢
    • 2018-08-28
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多