【问题标题】:Adding points to plot using ggplot2使用 ggplot2 为绘图添加点
【发布时间】:2023-03-04 17:50:01
【问题描述】:

这是我的数据集的前 9 行(共 54 行)和前 8 列(共 1003 列)

 stream n rates     means          1         2         3         4
 1   Brooks 3   3.0 0.9629152 0.42707006 1.9353659 1.4333884 1.8566225
 2  Siouxon 3   3.0 0.5831929 0.90503736 0.2838483 0.2838483 1.0023212
 3 Speelyai 3   3.0 0.6199235 0.08554021 0.7359903 0.4841935 0.7359903
 4   Brooks 4   7.5 0.9722707 1.43338843 1.8566225 0.0000000 1.3242210
 5  Siouxon 4   7.5 0.5865031 0.50574543 0.5057454 0.2838483 0.4756304
 6 Speelyai 4   7.5 0.6118634 0.32252396 0.4343109 0.6653132 2.2294652
 7   Brooks 5  10.0 0.9637475 0.88984211 1.8566225 0.7741612 1.3242210
 8  Siouxon 5  10.0 0.5804420 0.47501800 0.7383634 0.5482181 0.6430847
 9 Speelyai 5  10.0 0.5959238 0.15079491 0.2615963 0.4738504 0.0000000

这是我使用means 列中的值为流名称为 Speelyai (18) 的所有行绘制的一个简单图。

平均值列是通过取整行的平均值来计算的。每列代表 1 个模拟。因此,平均列是 1000 次模拟的平均值。我也想在绘图上绘制实际的模拟值。我认为不仅将平均值绘制(用一条线)而且还将“原始”数据(模拟)显示为点,这将是有益的。我看到我可以使用geom_point(),但不知道如何获得流名称为“Speelyai”的任何行的所有分数

谢谢


正如您所看到的,考虑到这些点是模拟结果或对原始数据重新采样的结果,我会假设这些比例有很大不同。但是我怎样才能以仍然保留视觉内容的方式将这些点叠加在我的原始图像上呢?在这张图片中,这条线看起来几乎是平的,但在我的原始图片中,我们可以看到它波动很大,只是规模很小......

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    同意@NickKennedy 的观点,将数据从宽变长重塑是个好主意:

    library(reshape)
    x2<-melt(x,id=c("stream","n","rates"))
    x2<-x2[which(x2$variable!="means"),] # this eliminates the entries for means
    

    现在是时候重新计算平均值了:

    library(data.table)
    setDT(x2)
    setkey(x2,"stream")
    means.sp<-x2["Speelyai",.(mean.stream=mean(value)),by=rates]
    

    所以现在你可以绘图了:

    library(ggplot2)
    p<-ggplot(means.sp,aes(rates,mean.stream))+geom_line()
    

    这正是你所拥有的,所以现在让我们添加点:

    p<-p+geom_point(data=x2[x2$stream=="Speelyai",],aes(rates,value))
    

    请注意,在对 geom_point 的调用中,您需要特别声明 data=,因为您正在使用与在对 ggplot 的调用中指定的数据集不同的数据集。

    ========== 编辑添加 =============

    回复您的 cmets,并借用 @akrun 给您的答案 here,您需要添加错误的计算,然后将调用更改为 geom_point

    df2 <- data.frame(stream=c('Brooks', 'Siouxon', 'Speelyai'), 
          value=c(0.944062036, 0.585852702, 0.583984402), stringsAsFactors=FALSE)
    x2$error <- x2$value-df2$value[match(x2$stream, df2$stream)]    
    

    然后将调用改为geom_point

    geom_point(data=x2[x2$stream=="Speelyai",],aes(rates,error))
    

    【讨论】:

    • 请注意,即使您绘制误差,y 范围仍然足够大(大约 4 个单位)以平滑均值曲线(我知道您希望将其显示为急剧变化),但是那么“你不能隐瞒事实”;)
    • 是的,你是对的!真的是相同的范围,这是问题....啊!我不知道该怎么办......
    【解决方案2】:

    我建议以长格式而不是宽格式重新格式化您的数据。例如:

    library("tidyr")
    library("ggplot2")
    my_data_tidy <- gather(my_data, column, value, -c(stream, n, rates, means))
    ggplot(subset(my_data_tidy, stream == "Speelyai"), aes(rates, value)) +
      geom_point() +
      stat_summary(fun.y = "mean", geom = "line")
    

    请注意,这也会根据您的数据重新计算均值。如果你想使用你现有的手段,你可以这样做:

    ggplot(subset(my_data_tidy, stream == "Speelyai"), aes(rates, value)) +
      geom_point() + geom_line(aes(rates, means), data = subset(my_data, stream == "Speelyai"))
    

    【讨论】:

    • 我明白了。我想你计算平均值的第一个 ggplot 代码没什么大不了的,它仍然应该得出相同的值。生成的图像看起来与我最初发布的图像有很大不同。我不知道如何将该图像添加到此评论中以显示给您。
    • 不同如何?在没有看到完整数据的情况下很难检查,尽管您现在将绘制 18000 个点。您可能需要使用alpha 才能使情节可用。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多