如何做出漂亮的複雜網路關係圖?
在UMAP論文中看到其中的配圖都非常漂亮,希望在數學建模中可以配上這樣比較Fancy的圖(比如下面兩圖),但是不知道用什麼軟體可以比較方便快捷的做出,同時做出的效果又還不錯?UCINET可以做出比較好的效果嗎?
……更新於2016.3.20號,附上所有代碼……
最近剛用R的igraph包和networkD3完成了一個項目的可視化內容(前者是靜態的後者是動態的),感覺還是比較好看的哈哈(溫馨提示,調亮手機) 。
:)
———————————————分割線——————————————
那現在我們來理一下思路,要做出這個效果其實真的一點都不難,現在再翻看剛開始學習時候寫的代碼……真的是……Naive哈哈。沒有一個循環一個function就能直接出圖的,不信你看——
```{r}
setwd("d:/Rproject")
set.seed(200)
App.use&<-read.table("app_data.txt",header = FALSE,sep= ",",
colClasses
=c("character","character"))
g1&<-na.omit(App.use)
```
#
# 說明
設定工作目錄;
設定種子節點,同一種布局畫出來的圖就是可以重複,不然即使同一種布局,展現的時候 由於位置的隨機也會呈現出不一樣的結果;
去除NA值,清除了若干條包含有缺失值的信息。
#
```{r}
library(igraph)
g2 =
graph.data.frame(d =g1, directed = F);
V(g2)
E(g2)
x&<-par(bg="white")
graph.density(g2)
V(g2)$bte =
betweenness(g2, directed = F)
par(mar = c(0, 2,
0, 0))
plot(V(g2)$bte)
```
#
# 說明
載入igraph包,這個包是R中對複雜網路的一個解決包;
對數據進行格式轉化,我選擇的數據是沒有方向度量的數據;
這兩者都使社會網路分析的函數代碼,分別代表定點和邊;
將背景設置為白色;
可以查詢群體的中心密度,並畫出相應的圖。
#
```{r}
x&<-par(bg="black")
V(g2)$size = 5
V(g2)[bte&>=1000]$size
=10
V(g2)[bte&<=100]$size =2
plot(g2,layout=layout.fruchterman.reingold,
vertex.label=NA,edge.arrow.size=1)
V(g2)[bte&>=1000]
# 說明
背景圖設置為黑色;
根據節點中心度的圖,現做以下處理;
①將中心度高於1000的節點的大小設置為10;
②將中心度低於100的節點的大小設置為2;
③將中心度在100到1000的節點的大小設置為5;
從圖中也可以直觀地看出,中間度最高的幾個節點,確實位於中介的地位具體看這六個點,分別是微信、百度地圖、淘寶、優酷、QQ和360。
```{r}
plot(g2,layout=layout.fruchterman.reingold,
vertex.size=V(g2)$size,vertex.label=V(g2)$V1)
plot(g2,layout=layout.fruchterman.reingold,vertex.size=V(g2)$size,
vertex.color=rgb(0.2,1,0.8,0.6),vertex.label=NA,edge.arrow.size=1)
```
# 說明
標籤數量太多,圖形看的很亂,因此開始用layout的函數進行調試;
vertex.size即點的大小;vertex.color是點的顏色;
vertex.label即標籤名,因為太多所以捨棄;
edge.arrow.size沒試出來,不知道是不是因為數據的原因;
此外還有vertex.label.cex、edge.color、edge.arrow.mode、edge.arrow.size等參數;
由於這個網路並不存在方向,所以size沒法使用;
另外調節線的寬度可以用下面這種方法單獨將「E(g2)$w=」列出來。
#
```{r}
com =
walktrap.community(g2,steps=5,merges = TRUE,
modularity = TRUE,
membership = TRUE)
V(g2)$sg=com$membership
V(g2)$color=rainbow(max(V(g2)$sg),alpha=0.6)[V(g2)$sg]
E(g2)$color=rgb(0.3,0.6,1,0.2)
```
#
# 資料
Igraph包中社區分類函數有以下幾種:
fastgreedy.community
spinglass.community
edge.betweenness.community
leading.eigenvector.community
walktrap.community
label.propagation.community
clique.community
multilevel.community
# 說明
不同的分類演算法,速度和適用社區網路大小都有所側重;
對於同一網路,採用什麼樣的分類演算法需要實踐後去人工判斷是否符合預期;
step類似於一種閾值,值越大劃分的約粗糙,由於本身數據的量不大,所以step取值較小;
第一行是特殊用法,sp即為subgroup;
其中rainbow即點的顏色,除了這種表達方式之外還能用rainbow(10, 0.8, 0.8, alpha=0.6);
[V(g2)$sg]實驗之後感覺是對顏色的排序進行定義,將相同的類別以相同的顏色表現。
#
```{r}
plot(g2,layout=layout.fruchterman.reingold,
vertex.size=V(g2)$size,
vertex.color=V(g2)$color,
edge.w=2,edge.arrow.size=0,
vertex.frame.color=NA,margin= rep(0, 1),
vertex.label=NA)
```
# 說明
設置點的大小為之前的值,點的顏色為之前設置為彩虹色,具體的參數還不熟悉,無箭頭標度;
設置邊得顏色為RGB,寬度為2,透明度為20%,具體數值可調整,邊界方位在0和1之間。
# 環形單色虹
```{r}
sg1 &<- cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.circle
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.w=1,
vertex.color= rgb(0.3,0.6,1,0.4))
```
# 環形彩虹
```{r}
E(g2)$color=V(g2)[name=ends(g2,E(g2))[,2]]$color
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.w=1,
vertex.color= rainbow(10, 0.8, 0.8,
alpha=0.8)[sg1$membership])
```
# 單色球體結構的社會網路分布
```{r}
sg1 &<- cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.w=1,
vertex.color= rgb(0.3,0.6,1,0.4))
```
# 多色球體單色線條結構的社會網路分布
```{r}
sg1 &<-
cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=rgb(0.3,0.6,1,0.4)
plot(g2,
layout=layout, vertex.size=V(g2)$size, vertex.label=NA,edge.w=1,
vertex.color=rainbow(10, 0.8, 0.8,
alpha=0.6)[sg1$membership])
```
#多色球體多色線條結構的社會網路分布
```{r}
sg1 &<- cluster_spinglass(g2, spins=6, gamma=2.0)
layout=layout.sphere
E(g2)$color=V(g2)[name=ends(g2,E(g2))[,2]]$color
plot(g2, layout=layout,
vertex.size=V(g2)$size, vertex.label=NA,edge.w=1,
vertex.color=rainbow(10, 0.8, 0.8,
alpha=0.6)[sg1$membership])
```
#
如果看到這了,覺得有用有幫助的,請點個贊加個關注唄:)
畢竟我只是一個關注不過3位數還在不斷默默耕耘的「知乎良民」
:)
多圖預警!!!
- 突出顯示重要節點
- 不同分組不同顏色
- 各種layout
- 有向曲線邊,節點大小,節點標籤大小,只有想不到,沒有做不到
當然了,邊粗細,邊標籤,邊顏色,曲邊曲率,節點顏色等等各種都可以設置,詳情請移步http://afternone.github.io/GraphPlot.jl/
謝邀
可能滿足你的需求的軟體是Gephi,顯示效果應該可以算作fancy,而且Ucinet中的.net文件格式可以直接導入Gephi中。 Ucinet可以做到上述第二幅圖的效果,對線條粗細顏色、箭頭大小、結點顏色、標籤字體大小、分布方式進行調節。Ucinet的計算分析功能是很強大的,但是顯示效果個人覺得一般,Gephi在這方面做得更好。
題主的目的是要好看並且方便快捷。個人的理解可視化效果要好主要是三個要素:
1.數據量。同樣的方法,同樣的設置,數據量的增大無疑會大大增加信息量和展示效果。
2.可視化信息:結點形狀顏色和大小 連接線條粗細顏色及箭頭 標籤字體顏色及大小。這裡面的每一個部分都需要根據表達目的進行調整和區分,而整體的效果是它們組合的結果,所以這一部分的調整比較耗時。
3.後期調整。布局方面,一般的軟體都有設定的布局演算法,進行選擇即可。選擇完後,自己再進行微調。此外,自己如果有額外的信息想顯示,可以加以PS,如上面的第一幅圖中的小圖片應該是後期調整的結果。
對於方便快捷方面,個人覺得以上的兩個軟體都還可以,基本都可以設置得到。當然,做網路圖的小軟體有很多特別是國外,論文應該也是發現這寫小軟體的途徑,個人使用經歷也很有限只是提供一個可能的方法。最後提一句,漂亮是重要的,不過弄清楚自己想要表達哪些信息是可視化的第一步,也是非常重要的一步。
以上。希望能幫到你。一般用R中的igraph包就可以實現。不過需要自己仔細調校。同時像mathematica應該這是可以直接做類似的圖。
Gephi是一個入門級別的工具,夠傻瓜,上手容易
R語言中的iGraph和networkD3包也足夠優秀,可以滿足你絕大多數的畫圖需要。
Processing和Photoshop是在此基礎上畫出更多效果的工具,前者將靜態圖做成動畫,後者不僅可以做成動畫,還可以增加很多的渲染。
Gephi可以比較容易地實現網路可視化
如果你用Python,有個package叫networkx也不錯
更自由同時需要寫更多code的方式是使用D3
R語言畫網路圖三部曲之networkD3 | 生信菜鳥團
上面這個講的不錯,方法很傻瓜,看了這個之後基本就會用network3D了
echarts可以實現。
Hausmann的產品空間網路么。。用netdraw能畫,但是這種中心邊緣結構看不出來;而且容易這軟體節點一多容易卡。他這個應該是R中的igraph包做的(其他軟體做不了這麼好看)
建議用cytoscape,數據量處理比gephi大,穩定性也好很多。
編程的話就用python + networkx
用python的話可以直接調networkx
g = networkx.Graph()
a = [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2]
b = [11,22,33,44,55,234,56,88,90,98,123,345,98,123,345]
c = [111,111,1111,122,122,122,134,1234,12424,111,123,123,2,2,2]
g.add_edges_from(zip(b,a))
g.add_edges_from(zip(b,c))
networkx.draw(g)
matplotlib.pylot.show()
作為一個調包俠的我…………,覺得這包畫關聯圖譜真是太方便了
Gephi吧,簡單易用,本人藉助其做市場競爭分析。
推薦使用D3
耶!感覺跟房屋平面設計差不多
igraph這個包就很好用的。
Julia挺方便的
真棒!
Gephi 我邊上的數據分析師就用,圖形化操作也比較方便。
推薦閱讀:
※數學建模論文套路總結?
※學數學的邏輯怎麼培養?
※如何構建一個表面積無限而體積有限的模型?
※請教C4D大神,這樣的圖應該怎樣建模?
※怎樣能紮實自己的數學基礎還有提高數學成績?