2013-02-27 137 views
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 

这应该很容易,但我不知道如何。

问候

回答

8

的基本想法,如果你想使用哈德利的ggplot2是让你的表格的数据绘制:

 x   y 
col_names  values 

而这可以通过使用哈德利的reshape2melt函数来完成。做?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会再列variabley将相应value列。

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

如果你不希望的颜色,那么就删除aes(colour=variable)内geom_point,使之成为geom_point()

enter image description here

编辑:我也许应该提到这里,你还可以用geom_jitter取代geom_point这会给你,好了,抖动点:

enter image description here

+0

由于这是伟大的。有没有办法为x轴的每个不同值设置不同的形状? – user1192748 2013-02-27 15:29:58

+0

是的,只需在'aes'内使用'shape = variable'就像'colour'。 – Arun 2013-02-27 15:38:21

+2

+1。我不是一个普通的ggplot2用户,所以总是很高兴看到可用的替代品。不过,有几条评论。首先,在这种情况下真的需要传奇吗?我没有看到这个特殊例子的附加价值。如果每个变量中有进一步的分组*,则可能有不同的颜色,形状和图例。其次,是否有可能更多地控制抖动?我发现它有点分散了抖动如何为某些变量留下大洞,但让其他人看起来更加聚集。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 06:23:19

5

这里有两个要考虑的选项。第一种使用dotplot从 “格子” 包:

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

enter image description here

第二使用从基础R的 “图形” 选项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 
     ) 
) 

结果:

enter image description here

编辑

下面是使用上的点Alpha透明度和与阿难在下面的评论中讨论摆脱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

+0

+1,我最初是想用带有抖动的stripcharts思考一些东西,但是后来我发现一个点阵图会给我显示不是抖动的单独点,而是它们出现在数据集中的顺序。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 06:15:37

+0

@AnandaMahto - 这是你的dotchart例子,激发了这种尝试。我猜想另外一个选项就是用低透明度(使用rgba颜色值)绘制点,并消除抖动。 – thelatemail 2013-02-28 08:09:16

+0

我认为这样,所以我更新了我的答案,以反映点图答案实际上*没有抖动。我喜欢在没有抖动的情况下以某种方式使用Alpha通道的想法。或者,使用开放形状(未填充)和透明度。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 08:13:01