【问题标题】:R - Creating Scatter Plot from Data FrameR - 从数据框中创建散点图
【发布时间】:2013-02-13 03:01:40
【问题描述】:

我有一个数据框all,如下所示:

http://pastebin.com/Xc1HEYyH

现在我想创建一个散点图,其中 x 轴上的列标题和相应的值作为数据点。例如:

7|                 x  
6|          x      x  
5|  x       x      x     x    
4|  x       x            x 
3|                             x      x  
2|                             x      x
1|
 ---------------------------------------
    STM    STM    STM   PIC   PIC    PIC
   cold   normal  hot  cold  normal  hot

这应该很容易,但我不知道怎么做。

问候

【问题讨论】:

    标签: r plot ggplot2 lattice scatter-plot


    【解决方案1】:

    如果您想使用 Hadley 的ggplot2 进行绘图,基本思想是获取表单的数据:

            x          y
    col_names     values
    

    这可以通过使用 Hadley 的 reshape2 中的 melt 函数来完成。执行?melt 以查看可能的参数。但是,这里既然我们要融化整个data.frame,我们只需要,

    melt(all) 
    # this gives the data in format:
    #   variable value
    # 1 STM_cold   6.0
    # 2 STM_cold   6.0
    # 3 STM_cold   5.9
    # 4 STM_cold   6.1
    # 5 STM_cold   5.5
    # 6 STM_cold   5.6
    

    这里,x 将是 variable 列,y 将对应 value 列。

    require(ggplot2)
    require(reshape2)
    ggplot(data = melt(all), aes(x=variable, y=value)) + 
                 geom_point(aes(colour=variable))
    

    如果您不想要这些颜色,则只需删除 geom_point 内的aes(colour=variable),使其变为geom_point()

    编辑:我可能应该在这里提一下,你也可以用geom_jitter 替换geom_point,这会给你,嗯,抖动点:

    【讨论】:

    • 谢谢,太好了。有没有办法为 x 轴的每个不同值设置不同的形状?
    • +1。我不是一个普通的 ggplot2 用户,所以看到可供用户使用的替代品总是很高兴。不过,有一些批评。首先,在这种情况下真的需要传说吗?我没有看到这个特定示例的任何附加值。如果每个变量还有进一步的分组,那么使用不同的颜色或形状以及一个图例可能是有意义的。其次,是否可以将抖动控制得更多一点?我发现抖动如何为某些变量留下大洞,但让其他变量看起来更加集中,这有点让人分心。
    【解决方案2】:

    这里有两个可供考虑的选项。第一个使用“lattice”包中的dotplot

    library(lattice)
    dotplot(values ~ ind, data = stack(all))
    

    第二个使用来自基本 R 的“图形”选项的dotchart。要使用dotchart 函数,您需要将data.frame 包装在as.matrix 中:

    dotchart(as.matrix(all), labels = "")
    

    请注意,此图形中的点不是“抖动”的,而是按照它们被记录的顺序呈现的。也就是说,最低点是第一个记录,最高点是最后一个记录。如果您放大此示例的绘图,您会看到有 16 条非常微弱的水平线。每行代表每一列中的一行。因此,如果您查看“STM_cold”的点或任何其他具有NA 值的变量,您会在顶部看到一些没有可用数据的空白行。

    这有其优点,因为如果按时间顺序记录值,它可能会随着时间的推移显示趋势,但如果源数据框中的行太多,也可能是一个缺点。

    【讨论】:

      【解决方案3】:

      使用基本 R 图形的手动版本只是为了好玩。

      获取数据:

      test <- read.table(text="STM_cold STM_normal STM_hot PIC_cold PIC_normal PIC_hot
      6.0 6.6 6.3 0.9 1.9 3.2
      6.0 6.6 6.5 1.0 2.0 3.2
      5.9 6.7 6.5 0.3 1.8 3.2
      6.1 6.8 6.6 0.2 1.8 3.8
      5.5 6.7 6.2 0.5 1.9 3.3
      5.6 6.5 6.5 0.2 1.9 3.5
      5.4 6.8 6.5 0.2 1.8 3.7
      5.3 6.5 6.2 0.2 2.0 3.5
      5.3 6.7 6.5 0.1 1.7 3.6
      5.7 6.7 6.5 0.3 1.7 3.6
      NA  NA  NA  0.1 1.8 3.8
      NA  NA  NA  0.2 2.1 4.1
      NA  NA  NA  0.2 1.8 3.3
      NA  NA  NA  0.8 1.7 3.5
      NA  NA  NA  1.7 1.6 4.0
      NA  NA  NA  0.1 1.7 3.7",header=TRUE)
      

      设置基本情节:

      plot(
           NA,
           ylim=c(0,max(test,na.rm=TRUE)+0.3),
           xlim=c(1-0.1,ncol(test)+0.1),
           xaxt="n",
           ann=FALSE,
           panel.first=grid()
           )
      
      axis(1,at=seq_along(test),labels=names(test),lwd=0,lwd.ticks=1)
      

      绘制一些点,带有一些 x 轴 jittering,这样它们就不会相互打印。

      invisible(
        mapply(
              points,
              jitter(rep(seq_along(test),each=nrow(test))),
              unlist(test),
              col=rep(seq_along(test),each=nrow(test)),
              pch=19
              )
      )
      

      结果:

      编辑

      这是一个在点上使用 alpha 透明度并去掉 jitter 的示例,如下面的 cmets 与 Ananda 讨论的那样。

      invisible(
        mapply(
              points,
              rep(seq_along(test),each=nrow(test)),
              unlist(test),
              col=rgb(0,0,0,0.1),
              pch=15,
              cex=3
              )
      )
      

      【讨论】:

      • +1,我最初想的是使用带抖动的条形图的东西,但后来我想到点图会显示没有抖动的单独点,但是而是它们在数据集中出现的顺序。
      • @AnandaMahto - 是您的点图示例激发了这一尝试。我想我想到的另一个选择是绘制不透明度低的点(使用 rgba 颜色值)并消除抖动。
      • 我是这么认为的,所以我更新了我的答案以反映点图答案实际上没有抖动。我喜欢在没有抖动的情况下以某种方式使用 Alpha 通道的想法。或者,使用开放形状(未填充)和透明度。
      • 有点相关,但你见过OpenIntro Statistics textbook吗?里面有几个情节我认为做得很好。想到的一个(如果您下载 PDF)是第 28 页上对箱线图的描述。
      • @AnandaMahto - 看起来不错,当我得到一个安静的时刻将不得不浏览一下。我已经更新以添加透明版本 - 似乎有点工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2020-10-11
      相关资源
      最近更新 更多