1

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

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) 分组,每只动物都应有自己的条形图。

第二个条形图应该是一个堆积图,显示每只动物act的百分比g

help(barplot)我读到的时候,我需要生成一个类似矩阵的数据结构。将数据放入 的首选方法是matrix什么?

在我还看到的一个示例中,人们使用?tables其中已经包含名称的那个。表格和矩阵之间有什么区别,如何从我的数据生成表格?

4

2 回答 2

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) 

在此处输入图像描述

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

在此处输入图像描述

添加图例、标题等的练习将留给读者:)


table a 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), "\\.")))
于 2013-04-19T10:31:00.113 回答
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)

结果:

在此处输入图像描述

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)

结果:

在此处输入图像描述

于 2013-04-19T10:26:50.407 回答