2016-02-10 34 views
2

我有一個簡單的3列數據框。第1列包含隨時間收集的樣品(A-D)。列2標識數據中表示交互網站的鏈接對。任何一個樣本中最多可以有10個標識符對。柱3點(1-3)的相互作用的標識符操作圖中數據點的位置

的第一項任務是bin和圖形的數據之間的強度。由於排名值是整數,因此我使用geom_jitter()將它們分發到垃圾箱內的其他位置。然後,我將形狀/顏色分配給每個唯一標識符對,以便我可以跟蹤樣本之間的單個對(即它們是否增加或減少排名)。

這是我做了什麼至今:

Sample <- c("A","A","A","B","B","C","C","D","D","D") 
Rank <- c(3,3,1,3,3,2,3,3,2,1) 
Site <- c(101202,102203,101201,102203,101202,101202,102203,102203,101201,101202) 
DataSet <- as.data.frame(cbind(Sample,Rank,Site)) 
ggplot(data=DataSet, aes(x=Sample, y=Rank, group=factor(Site), colour = factor(Site))) + geom_jitter(aes(shape = factor(Site)), size = 4) + geom_vline(xintercept=seq(0.5,length(unique(DataSet$Sample)), 1), lwd=0.5, colour="black",linetype = "dotted") + geom_hline(yintercept=seq(0.5, length(unique(DataSet$Rank))+0.5, 1), lwd=0.5, colour="black",linetype = "dotted") + scale_shape_manual(values=c(16:18)) + theme(legend.position="none", panel.background = element_rect(fill = "white")) 

What I get

我的問題是:爲了進一步助手可視化,我想每一個獨特的標識符對分配到倉內的同一位置。有沒有辦法做到這一點?

爲了說明我的意思是,請找到提供嘲弄式的人物。

What I want

因此,例如,在藍色的標識符對在樣品A排1到d和其倉內的位置是相同的(即,左上角)。綠色的標識符對改變等級,但其位置在相應倉的右下方。

回答

2

這可能是一個開始。它基於抖動是點的x和y座標的隨機添加的想法。因此,如果我們將預定值添加到x和y,則根據站點ID,點應該出現在相同站點的相同位置。

首先,我們根據site-id生成相對位置的數據幀。

position_data <- data.frame(id=1:10, 
          x=c(rep(seq(-0.4,0.4,length.out=3),3),0), 
          y = rep(seq(0.4,-0.4,length.out=4),c(3,3,3,1))) 

我們請檢查是否這種分佈是我們的初衷:

ggplot(position_data, aes(x=x, y=y)) + geom_text(aes(label=id)) 

enter image description here

然後,我們合併這與原來的數據集:

#generate identifier 
DataSet$Site_ID <- as.numeric(DataSet$Site) 

plotdata <- merge(DataSet, position_data, by.x="Site_ID",by.y="id") 

然後我們將x-es和ys添加到Rank和Sample-positions中:

plotdata$y <- plotdata$y + as.numeric(plotdata$Rank) 
plotdata$x <- plotdata$x + as.numeric(plotdata$Sample) 

現在,我們就可以繪製:

ggplot(data=plotdata, aes(x=x, y=y, group=factor(Site), colour = factor(Site),shape=factor(Site))) + 
    geom_point(size=5)+ 
    geom_vline(xintercept=seq(0.5,length(unique(DataSet$Sample)), 1), lwd=0.5, colour="black",linetype = "dotted") + 
    geom_hline(yintercept=seq(0.5, length(unique(DataSet$Rank))+0.5, 1), lwd=0.5, colour="black",linetype = "dotted") + 
    scale_shape_manual(values=c(16:18)) + 
    theme(legend.position="none", panel.background = element_rect(fill = "white")) + 
    scale_x_continuous(breaks=1:length(unique(plotdata$Sample)),labels=sort(unique(plotdata$Sample)),name="Sample") + 
    scale_y_continuous(breaks=1:length(unique(plotdata$Rank)), labels=sort(unique(plotdata$Rank)),name="Rank") 

注意,我們從軸的因素就到數字,所以我們只好自定義比例添加到這兩個。

結果: enter image description here

+0

大。我不知道從哪裏開始嘗試定義和實現我自己的x和y座標。 當我嘗試將解決方案應用到我自己的(較大)數據集時,我遇到了將DataSet和position_data合併的困難。我最終爲DataSet添加了一個新的列,爲「Site_ID」定義了唯一值,並使用 transform(top_sites,id = match(id,unique(id)) –

+0

將這些值與position_data $ id中的值匹配。 ?我不知道Site的數據類型是什麼,當它是一個字符變量時,可能需要在轉換爲數字之前轉換爲factor。 – Heroka

+0

對不起,在完成我的思路之前,我按了添加評論。 在您的原始解決方案中,DataSet和position_data是等長的數據幀。 position_data定義座標。在我的大型數據集中有50行,當我使用by.x或by.y時,我收到錯誤。我的解決方法很好,但其笨拙 –