图表均值和标准差

时间:2013-12-23 20:28:48

标签: r ggplot2

此数据的来源是服务器性能指标。我的数字是平均值(os_cpu)和标准差(os_cpu_sd)。意思是显然不能讲述整个故事,所以我想添加标准偏差。我开始沿着geom_errorbar的路径,但我相信这是标准错误。绘制这些指标的可接受方式是什么?以下是一个可重复的例子:

DF_CPU <- structure(list(end = structure(c(1387315140, 1387316340, 1387317540, 
   1387318740, 1387319940, 1387321140, 1387322340, 1387323540, 1387324740, 
   1387325940, 1387327140, 1387328340, 1387329540, 1387330740, 1387331940, 
   1387333140, 1387334340, 1387335540, 1387336740, 1387337940, 1387339140, 
   1387340340, 1387341540, 1387342740, 1387343940, 1387345140, 1387346340, 
   1387347540, 1387348740, 1387349940), class = c("POSIXct", "POSIXt"
   ), tzone = "UTC"), os_cpu = c(14.8, 15.5, 17.4, 15.6, 14.9, 14.6, 
     15, 15.2, 14.6, 15.2, 15, 14.5, 14.8, 15, 14.6, 14.9, 14.9, 14.4, 
     14.8, 14.9, 14.5, 15, 14.6, 14.5, 15.3, 14.6, 14.6, 15.2, 14.5, 
     14.5), os_cpu_sd = c(1.3, 2.1, 3.2, 3.3, 0.9, 0.4, 1.4, 1.5, 
        0.4, 1.6, 1, 0.4, 1.4, 1.4, 0.4, 1.3, 0.9, 0.4, 1.4, 1.3, 0.4, 
        1.7, 0.4, 0.4, 1.7, 0.4, 0.4, 1.7, 0.5, 0.4)), .Names = c("end", 
            "os_cpu", "os_cpu_sd"), class = "data.frame", row.names = c(1L, 
                5L, 9L, 13L, 17L, 21L, 25L, 29L, 33L, 37L, 41L, 45L, 49L, 53L, 
                57L, 61L, 65L, 69L, 73L, 77L, 81L, 85L, 89L, 93L, 97L, 101L, 
                  105L, 109L, 113L, 117L))

head(DF_CPU)
                   end os_cpu os_cpu_sd
1  2013-12-17 21:19:00   14.8       1.3
5  2013-12-17 21:39:00   15.5       2.1
9  2013-12-17 21:59:00   17.4       3.2
13 2013-12-17 22:19:00   15.6       3.3
17 2013-12-17 22:39:00   14.9       0.9

ggplot(data=DF_CPU, aes(x=end, y=os_cpu)) +
  geom_line()+
  geom_errorbar(aes(ymin=os_cpu-os_cpu_sd,ymax=os_cpu+os_cpu_sd), alpha=0.2,color="red")

enter image description here

Per @ ari-b-friedman建议,这是geom_ribbon()的样子: enter image description here

2 个答案:

答案 0 :(得分:4)

你的问题主要是关于美学,所以意见会有所不同。说完了一些指导原则:

  1. 强调重要的事情。
  2. 尽可能提供参考框架。
  3. 避免误导尺度或图形。
  4. 避免不必要的图片。
  5. 所以这段代码:

    ggplot(data=DF_CPU, aes(x=end, y=os_cpu)) +
      geom_point(size=3, shape=1)+
      geom_line(linetype=2, colour="grey")+
      geom_linerange(aes(ymin=os_cpu-1.96*os_cpu_sd,ymax=os_cpu+1.96*os_cpu_sd), alpha=0.5,color="blue")+
      ylim(0,max(DF_CPU$os_cpu+1.96*DF_CPU$os_cpu_sd))+
      stat_smooth(formula=y~1,se=TRUE,method="lm",linetype=2,size=1)+
      theme_bw()
    

    产生这个:

    该图强调了超过20分钟间隔的cpu利用率(??)与监测的9小时期间的平均值没有明显偏差。参考线是平均利用率。错误栏已替换为geom_linerange(...),因为geom_errorbar(...)中的水平栏不会增加任何内容并且会分散注意力。此外,您的原始图表使得看起来错误与实际利用率相比非常大,而事实并非如此。我将范围更改为+/- 1.96*sd,因为它更接近95%CL。最后,x轴和y轴标签需要用描述性的东西替换,但我没有足够的信息来做到这一点。

答案 1 :(得分:2)

设计师的格言是“形式跟随功能”,这应该适用于图形。你想用你的阴谋做什么?你想回答的问题是什么?

如果是“cpu使用率是否随时间显着下降?”然后这个情节可能会做,并给出答案“否”。如果是“超过10秒的概率是否随时间而变化?”那么你需要为你的数据假设一个模型(例如像Normal(os_cpu,os_cpu_sd)那样简单的东西),然后绘制超越(尾部)概率。

无论如何,只是像你所做的那样绘制手段和信封总是一个公平的开始,至少回答“我的数据是什么样的?”的问题。并且“显然是错的?”