如何预处理数据以在R中生成条形图

时间:2013-04-19 10:13:04

标签: r plot

我想从列表中的值生成(分组和堆叠)条形图:

dog = list(a=100, c=30, t=140, g=102)
cat = list(a=99,  c=31, t=150, g=123)
pig = list(a=100, c=12, t=90,  g=144)

在第一个条形图中,数据应该是字母(ACTG),并且每只动物都应该拥有它自己的条形图。

第二个条形图应该是一个叠加图,每个动物显示actg的百分比。

help(barplot)我读过,我需要生成一个类似Matrix的数据结构。将数据放入matrix

的首选方法是什么?

在一个例子中我也看到,人们使用已经有名字的?tables。表格和矩阵之间有什么区别,我如何从数据中生成表格?

2 个答案:

答案 0 :(得分:2)

以下是将数据合并到矩阵中的一种方法:

temp <- do.call(cbind, lapply(list(dog = dog, cat = cat, pig = pig), unlist))
temp
#   dog cat pig
# a 100  99 100
# c  30  31  12
# t 140 150  90
# g 102 123 144
str(temp)
#  num [1:4, 1:3] 100 30 140 102 99 31 150 123 100 12 ...
#  - attr(*, "dimnames")=List of 2
#   ..$ : chr [1:4] "a" "c" "t" "g"
#   ..$ : chr [1:3] "dog" "cat" "pig"
is.matrix(temp)
# [1] TRUE

如果您想将动物作为行,请使用rbind或转置(t)数据。


从那里开始,绘图很简单:

# Grouped by ACGT, each animal own bar
barplot(t(temp), beside = TRUE) 

enter image description here

# Stacked bar plot
barplot(prop.table(temp, margin = 2))

enter image description here

添加传说,标题等的练习将留给读者:)


table 一个matrix,但我不认为这是您在寻找数据的原因。通常,table函数用于制表频率。

这是一个基本的例子:

set.seed(1)
mydf <- data.frame(A = sample(letters[1:4], 20, replace = TRUE),
           B = sample(c("red", "green", "blue"), 20, replace = TRUE))
mytable <- table(mydf)
mytable
#    B
# A   blue green red
#   a    0     3   1
#   b    3     0   2
#   c    2     3   0
#   d    1     2   3
is.matrix(mytable)
# [1] TRUE 

barplot函数将直接接受此作为输入。


最后,快速将您的数据转换为“长”data.frame(这很有用,正如@mOnhawk所证明的那样,不仅仅是为ggplot2绘图,还有lattice })使用如下内容:

temp <- stack(data.frame(dog = dog, cat = cat, pig = pig))
temp1 <- cbind(temp[-2], do.call(rbind, strsplit(as.character(temp$ind), "\\.")))

答案 1 :(得分:1)

您可以使用

创建matrix
data <- matrix(c(dog, cat, pig), nrow=3, ncol=4, dimnames=list(c("dog", "cat", "pig"), c("A", "C", "T", "G")))
data

>   dog cat pig
> A 100 99  100
> C 30  31  12 
> T 140 150 90 
> G 102 123 144

简介:

barplot(data)

结果:

enter image description here

x <- data.frame(
     animals=c(rep("dog",4),rep("cat",4),rep("pig",4)),
     gen=c(rep(c("A","C","T","G"),3)),
     value=c(100,30,140,102,99,31,150,123,100,12,90,144))

>    animals gen value
> 1      dog   A   100
> 2      dog   C    30
> 3      dog   T   140
> 4      dog   G   102
> 5      cat   A    99
> 6      cat   C    31
> 7      cat   T   150
> 8      cat   G   123
> 9      pig   A   100
> 10     pig   C    12
> 11     pig   T    90
> 12     pig   G   144

借助:

library(ggplot2)
library(reshape2)

ggplot(mx, aes(x=animals,y=value)) + 
     geom_bar(stat="identity") + 
     facet_grid(~gen)

结果:

enter image description here