R - 从数据框创建散点图

5
我有一个数据框 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

这应该很简单,但我想不出来怎么做。
问候
3个回答

8
基本思路是,如果您想使用Hadley的ggplot2进行绘图,则需要将数据格式化为以下形式:
        x          y
col_names     values

要实现这一点,可以使用Hadley的reshape2中的melt函数。输入?melt查看可能的参数。然而,由于我们想要融合整个数据框,所以我们只需要:

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 将成为对应的值列。
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轴值设置不同的形状? - user1192748
2
+1. 我不是一个常规的ggplot2用户,所以看到可供使用者使用的替代方案总是很好的。然而,我有一些批评意见。首先,在这种情况下真的需要图例吗?我没有看到这个特定示例的任何附加价值。如果在每个变量内部有进一步的分组,可能有不同的颜色或形状和图例是有意义的。其次,是否可以更好地控制抖动?我发现抖动会留下一些变量的大空洞,但使其他变量似乎更聚集,这让人感到有些分散注意力。 - A5C1D2H2I1M1N2O1R2T1

5

这里有两个选项需要考虑。第一个选项使用“lattice”包中的dotplot函数:

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

enter image description here

第二个示例使用了base R "graphics"选项中的dotchart函数。要使用dotchart函数,您需要将data.frameas.matrix进行包装:

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

请注意,这张图中的点并不是“抖动”的,而是按照记录的顺序呈现。也就是说,最低点是第一次记录,最高点是最后一次记录。如果你放大这个例子的图表,你将会看到16条非常模糊的水平线。每条线代表一个列中的行。因此,如果你查看“STM_cold”或其他有NA值的变量的点,你会看到一些空白行,因为在这些行中没有可用数据。
这种方法有其优点,因为如果值按时间顺序记录,它可能显示出随时间的趋势。但如果源数据框中有太多的行,则可能会成为缺点。 enter image description here

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轴进行jitter处理,以避免它们重叠在一起。

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

结果:

在此输入图像描述

编辑

以下是一个示例,使用点的alpha透明度并且按照与Ananda在下面评论中讨论的方式去除了jitter

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

enter image description here


+1,我最初考虑使用应用抖动的stripcharts,但后来想到使用dotchart可以显示出不是抖动过的单独点,而是它们在数据集中出现的顺序。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto - 是你的点状图示例激发了我尝试。我想到的另一个选择是使用低不透明度(使用rgba颜色值)绘制点,摆脱抖动。 - thelatemail
我已经想到了这一点,所以我更新了我的答案以反映出dotchart答案实际上并没有抖动。我喜欢使用alpha通道的想法,而不需要抖动。或者,使用开放形状(未填充)以及透明度。 - A5C1D2H2I1M1N2O1R2T1
有点相关,但你看过OpenIntro 统计教材吗?里面有几个图表我认为做得非常好。其中一个让我想起来的是第28页上描述箱线图的那个。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto - 看起来不错,等我有空闲的时候会仔细浏览一下。我已经更新了透明版本 - 似乎有点作用。 - thelatemail
我喜欢那个新的替代方案。我觉得它既美观又信息量大。有机会在更大的数据集上尝试一下会很有趣。如果可以的话,我会再给你一个赞的 ;) - A5C1D2H2I1M1N2O1R2T1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接