2016-01-24 29 views
4

使用geom_net給定一個數據幀如下:Inproper顯示當作爲R

v1  v2  v3  v4 
Tom  A  Jim  B 
Gary A  Shirly A 
Shirly B  Jack B 
Tom  A  Jack B 
... 

V2和V4表示該基團中的名稱v1和v3的分別屬於。 Tom屬於A組,Jim屬於v4組。 我想繪製一個geom_net的社交網絡,如果它們在同一行中,則可以通過線條鏈接到兩個名稱,例如TomJim。並且邊緣的大小應該與它們在V3中出現的次數成正比,即Jack的邊緣應該是JimShirly的兩倍。

我試圖

ggplot(df, aes(from_id = V1,to_id = V3)) +geom_net() 

,而是一個非常壞的結果給出: enter image description here

,併產生一個警告:

In f(..., self = self) : 
There are 35 nodes without node information: 
#And the below are all the values in V1 and V3 
Tom, Shirly, .... 
Did you use all=T in merge? 

我不知道如何來顯示結果以適當的沒有x軸或y軸的好看的方式和邊緣之間的關係應該清楚地顯示出來。邊緣的顏色應該代表它們所屬的組。這意味着同一組中的所有名稱應具有相同的顏色。

希望得到你的幫助!提前致謝!

+0

嗨。你有沒有得到這個解決?如果是這樣,怎麼樣? – hackR

+0

@hackR不,我最後使用了igraph。 – user5779223

回答

1

我也一直在努力,直到我找出了geom_net包的正確data.frame結構。基本上你需要的是一個data.frame,它有兩部分:在第一部分中,通過提供一個FROM和一個TO列來描述邊緣(繪製的線條)。可選的,額外的信息可以在例如單獨的列來提供,線寬

ans <- read.table(text =" 
from to linewidth 
Tom Jim 0.1 
Gary Shirly 1 
Shirly Jack 0.5 
Tom Jack 2 
", sep = " ", stringsAsFactors = FALSE, header=TRUE) 

p <- ggplot(data = ans, aes(from_id = from, to_id = to)) 
p + geom_net(label = TRUE, vjust=-1) 

但是你會發現,一些節點(頂點)都沒有標註。所以這是data.frame的第2部分很重要的地方。在第2部分中,提供了要標記的節點的名稱。這是因爲geom_net只標記FROM節點而不標記TO節點,因此您至少需要提供未用作FROM點的節點名稱。

ans <- read.table(text =" 
from to linewidth 
Tom Jim 0.1 
Gary Shirly 1 
Shirly Jack 0.5 
Tom Jack 2 
Helen Jack 3 
Jim NA NA 
Jack NA NA 
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA") 

p <- ggplot(data = ans, aes(from_id = from, to_id = to, linewidth = linewidth)) 
p + geom_net(label = TRUE, vjust=-1) 

若干事情在進行以上:1)I加入 「吉姆NA NA傑克NA NA」 爲標籤的未標記的節點,2)還添加na.strings = 「NA」,以確保函數read.table( )正確地解釋NA值,並且3)我將線寬參數添加到aes,以便它從data.frame映射到plot。另外,一旦爲所有節點提供了名稱,警告消息「有XX個節點沒有節點信息」就會消失。

希望有幫助 enter image description here 編輯:按要求我添加了結果輸出。由於geom_net()每次運行時改變佈局,我已經包含了兩個示例圖像


只是爲了完成整個data.frame建設過程中,我已經包含下面,你有兩個獨立的數據的情況。幀,你需要將它們合併在一起:第一個data.frame用於行(邊),第二個是節點(頂點)。

lines <- read.table(text =" 
from to linewidth 
Tom Ivy 0.1 
Gary Ivy 1 
Shirly Ivy 0.5 
Tom Helen 2 
Helen Ivy 3 
", sep = " ", stringsAsFactors = FALSE, header=TRUE, na.strings = "NA") 

nodes <- read.table(text =" 
name 
Tom 
Jim 
Gary 
Shirly 
Jack 
Helen 
Susan 
Joel 
Ivy 
", sep = " ", stringsAsFactors = FALSE, header=TRUE,na.strings = "NA") 

df <- merge(lines, nodes, by.x = "from", by.y = "name", all = TRUE) 

p <- ggplot(data = df, aes(from_id = from, to_id = to, linewidth = linewidth)) 
p + geom_net(label = TRUE, vjust=-1) 

enter image description here

+0

我還沒有嘗試過,但我認爲你的解決方案對我的問題完全正確,因爲我在igraph中得到的結果與geom_net中的結果非常相似。但沒有出現在V1中的名字都沒有。順便說一句,你可以上傳你得到的圖表嗎?謝謝! – user5779223

0

geomnet的維護者在這裏。如果可能,請將未來的問題發佈到github.com/sctyner/geomnet/issues。 @hackR有正確的想法,其中文檔中有幾個例子。這個想法是:你有一個邊數據框有一個from_id和一個to_id列(+附加列),並且你還有一個帶有id列的頂點數據框(+附加列)。然後你合併它們:

network_data <- merge(edges, vertices, by.x = "from_id", by.y = "to_id", all = T) 

不要忘記包含all = T參數!

謝謝,山姆。