2012-01-05 47 views
2

我有一个数据文件按行组织,有x标签,y标签,然后是一个值。其基本结构是这样的:重新排列对角线以下的绘图值?

Factor_1,Factor_2,Number
apple,apple,1
banana,apple,1
apple,kiwi,6
apple,pear,1
watermelon,apple,8
banana,banana,3
banana,kiwi,2
banana,pear,1
banana,watermelon,9
kiwi,kiwi,9
pear,kiwi,4
kiwi,watermelon,4
pear,pear,3
pear,watermelon,9
watermelon,watermelon,1
...
...

利用这些数据,我使用这个代码建立一个相关矩阵一些类似于:

library(ggplot2) 
library(reshape2) 

d <- read.csv("my_file", head=TRUE, sep="\t") 
x <- dcast(d, Factor_1~Factor_2) 
x.m <- melt(x) 
x.m <- ddply(x.m, .(variable)) 
(p <- ggplot(x.m, aes(variable, Factor_1)) + geom_tile(aes(fill = value), colour = "black") + scale_fill_gradient(low = "black", high = "green") 

上面的代码给了我一个情节看起来像这样:

plot

我怎样才能重新排序数据来构建与F曲线在所有数据分组在对角线以下的格式?

A B K P W 
W    1 
P   3 9 
K  9 4 4 
B  3 2 1 9 
A 1 1 6 1 8 
+0

当我运行的代码和数据子集,你已经张贴产生一个情节,看起来就像你已经什么请求。您是否尝试过自己运行发布的示例?而且,在代码的最后一行中有一个右括号。 – 2012-01-05 18:31:15

+0

@DWin - 第一个代码块的第二行是'apple,apple,1'。或者你的意思是不同的? – 2012-01-05 18:49:10

+0

@ JoshO'Brien你是对的;事实上,水果的例子确实产生了期望的产出。在我的实际数据集中,x和y标签的顺序不正确。我更新了数据集来描述我的问题。请注意,有些行(例如'西瓜,苹果,8')出现故障。 – drbunsen 2012-01-05 19:01:18

回答

3

我把它叫做“水果”:

fruit.tbl <- xtabs(V3 ~ V1+V2, data=fruits) 
> melt(fruit.tbl) 
      V1   V2 value 
1  apple  apple  1 
2  banana  apple  0 
3  kiwi  apple  0 
4  pear  apple  0 
5 watermelon  apple  0 
6  apple  banana  1 
7  banana  banana  3 
8  kiwi  banana  0 
9  pear  banana  0 
10 watermelon  banana  0 
11  apple  kiwi  6 
12  banana  kiwi  2 
13  kiwi  kiwi  9 
14  pear  kiwi  0 
15 watermelon  kiwi  0 
16  apple  pear  1 
17  banana  pear  1 
18  kiwi  pear  4 
19  pear  pear  3 
20 watermelon  pear  0 
21  apple watermelon  8 
22  banana watermelon  9 
23  kiwi watermelon  4 
24  pear watermelon  9 
25 watermelon watermelon  1 

mfruit <- melt(fruit.tbl) 
is.na(mfruit$value) <- mfruit$value==0 

# Needed to swap x and y to get it the way you wanted 
(p <- ggplot(melt(mfruit), aes(V2, V1,fill = value)) + 
       geom_tile(colour = "black") + 
       scale_fill_gradient(low = "black", high = "green") 
    ) 

enter image description here

+0

非常感谢。这正是我所期待的。 – drbunsen 2012-01-05 22:07:28

3

一个解决方案是立即获取您的data.frame的前两列中的元素以正确的顺序。 (一注意:这个工作,两列应该是一流的字符的。如果是替代因素,一是强迫他们与as.character()

执行以下操作后,该地块应该站出来,就像你” ð喜欢它:

ordered <- apply(d[c("Factor_1", "Factor_2")], 1, sort) 
d[c("Factor_1")] <- ordered[1,] 
d[c("Factor_2")] <- ordered[2,] 

要查看的代码做了什么,这里是第6行data.frame的重新排序前:

Factor_1 Factor_2 Number 
1  apple apple  1 
2  banana apple  1 
3  apple  kiwi  6 
4  apple  pear  1 
5 watermelon apple  8 
6  banana banana  3 

,并在这里他们算账:

Factor_1 Factor_2 Number 
1 apple  apple  1 
2 apple  banana  1 
3 apple  kiwi  6 
4 apple  pear  1 
5 apple watermelon  8 
6 banana  banana  3