R - 从数据框创建散点图

时间:2013-02-27 10:33:26

标签: r plot ggplot2 lattice scatter-plot

我的数据框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 个答案:

答案 0 :(得分:8)

如果您想使用Hadley的ggplot2绘图,基本想法是获取表格的数据:

        x          y
col_names     values

这可以通过使用Hadley的melt中的reshape2函数来完成。请?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()

enter image description here

修改:我在这里可能会提到,您也可以将geom_point替换为geom_jitter,这样就可以给你带来喋喋不休的点数:

enter image description here

答案 1 :(得分:5)

以下两个选项需要考虑。第一个使用“lattice”包中的dotplot

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

enter image description here

第二个使用基础R的“图形”选项中的dotchart。要使用dotchart功能,您需要将data.frame包裹在as.matrix中:

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

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

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

enter image description here

答案 2 :(得分: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的示例,如下面与Ananda的评论所述。

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