2016-04-03 84 views
2

我需要幫助來創建圖表。我解釋得更好。從不同的數據創建圖表

我創建了10個隨機圖,每個圖都有N個節點。 我已經做了N = 10^3,10^4,10^5。 所以共有30張圖。

他們每個人都找到了他們擁有的多重鏈接和selfloops的百分比。

現在我想創建一個單一的圖表,顯示節點數目的功能百分比。 因此,像:

expected_chart

所以我有一個3所列出: - listNets含30個圖 - listSelf含selfloops 的百分比 - listMul含多鏈路的百分比

這是什麼我做了:

listN <- c((10^3), (10^4), (10^5)) 

# list of networks 
listNets <- vector(mode = "list", length = 0) 
# list of percentage of selfloops 
listSelf <- vector(mode = "list", length = 0) 
#list of percentage of multilinks 
listMul <- vector(mode = "list", length = 0) 

... 

for(N in listN) { 

    ... 

    net <- graph_from_adjacency_matrix(adjmatrix = adjacency_matrix, mode = "undirected") # it's work, infact if I plot it i saw a correct networks 
    listNets <- c(listNets, net) # I add net to list of networks 
    x11() 
    plot(net, layout = layout.circle(net)) 

    ... 

    # I find self-loops e multilinks 
    netmatr <- as_adjacency_matrix(net, sparse = FALSE) 
    num_selfloops <- sum(diag(netmatr)) 
    num_multilinks <- sum(netmatr > 1) 

    # I find percentage 
    per_self <- ((num_selfloops/num_vertices)*100) 
    per_mul <- ((num_multilinks/num_edges)*100) 

    listSelf <- c(listSelf, per_self) 
    listMul <- c(listMul, per_mul) 
} 

現在if我打印listNets這樣我有一些奇怪的事情:

> print(listNets) 
[[1]] 
[1] 9 

[[2]] 
[1] FALSE 

[[3]] 
[1] 7 6 3 8 8 8 

[[4]] 
[1] 0 1 2 4 5 7 

[[5]] 
[1] 2 1 0 3 4 5 

[[6]] 
[1] 0 1 2 3 4 5 

[[7]] 
[1] 0 0 0 0 1 1 1 2 3 6 

[[8]] 
[1] 0 1 2 3 3 4 5 5 6 6 

[[9]] 
[[9]][[1]] 
[1] 1 0 1 

[[9]][[2]] 
named list() 

[[9]][[3]] 
list() 

[[9]][[4]] 
list() 


[[10]] 
<environment: 0x000000001a6284a8> 

[[11]] 
[1] 9 

[[12]] 
[1] FALSE 

[[13]] 
[1] 2 5 8 8 7 8 

[[14]] 
[1] 0 1 3 4 6 7 

[[15]] 
[1] 0 1 4 2 3 5 

[[16]] 
[1] 0 1 2 3 4 5 

[[17]] 
[1] 0 0 0 1 1 1 2 2 3 6 

[[18]] 
[1] 0 1 2 2 3 4 4 5 6 6 

[[19]] 
[[19]][[1]] 
[1] 1 0 1 

[[19]][[2]] 
named list() 

[[19]][[3]] 
list() 

[[19]][[4]] 
list() 


[[20]] 
<environment: 0x000000001a859e28> 

... 

相反,如果我打印了其他兩個列表(listSelflistMult一切正常)。

現在,我該如何繪製這些數據?

我讀了關於數據框,但我不明白如何使用它在我的情況。 有人可以幫我嗎?

我試着用手寫一個可能的結果表格放在csv文件上,然後嘗試繪製它,看看我是否正確地走向正確的方向。

這是代碼,這是結果。 注意:我手工創建的表格和我發明的百分比。

> df <- read.csv("./table.csv", sep = ",") # read csv file 
> df 
     N perSelf perMul 
1 10^3  2  1 
2 10^3  5  1 
3 10^3  98  15 
4 10^3  50  51 
5 10^3  41  52 
6 10^3  21 100 
7 10^3  36  80 
8 10^3  70  20 
9 10^3  80  55 
10 10^3  100  44 
11 10^4  2  1 
12 10^4  5  18 
13 10^4  100  20 
14 10^4  50  51 
15 10^4  51  52 
16 10^4  21 100 
17 10^4  36  80 
18 10^4  70  20 
19 10^4  73  85 
20 10^4  100  98 
21 10^5  100  10 
22 10^5  5  1 
23 10^5  98  15 
24 10^5  50  51 
25 10^5  41  52 
26 10^5  21  85 
27 10^5  36  80 
28 10^5  65  20 
29 10^5  80  55 
30 10^5  100  44 

wrong_result

也有一些是錯誤的。

非常感謝


enter image description here

的代碼是:

# create a matrix from a list (list_all) 
mat <- matrix(unlist(list_all), 
       unique(lengths(list_all)), 
       dimnames = list(NULL, c("N", "% selfloops", "% multilinks"))) 

# convert matrix to data frame 
df <- as.data.frame(x = mat, row.names = NULL) 
df 

# plot 
dflong <- melt(df, id.vars = 'N') 

x11() 
ggplot(dflong, aes(x = N, y = value, color = variable)) + 
    geom_point(size = 5, alpha = 0.7, position = position_dodge(width = 0.3)) + 
    scale_x_discrete(labels = parse(text = as.character(unique(dflong$N)))) + 
    scale_y_continuous('', breaks = seq(0, 100, 25), labels = paste(seq(0, 100, 25), '%')) + 
    scale_color_manual('', values = c('red', 'blue'), 
        labels = c('Percentage of selfloop','Percentage of multilinks')) + 
    theme_minimal(base_size = 14) 

df是:

N % selfloops % multilinks 
1 10 11.111111  0.00000 
2 10 11.111111  0.00000 
3 10 0.000000  0.00000 
4 20 0.000000  0.00000 
5 20 0.000000  15.38462 
6 20 0.000000  0.00000 
7 30 3.448276  0.00000 
8 30 3.448276  0.00000 
9 30 0.000000  0.00000 

回答

2

以你df數據幀爲出發點,您可以分兩步得到期望的結果:

1)重塑你的數據爲長格式reshape2

library(reshape2) 
dflong <- melt(df, id.vars = 'N') 

2)繪製數據與GGPLOT2

library(ggplot2) 
ggplot(dflong, aes(x = N, y = value, color = variable)) + 
    geom_point(size = 5, alpha = 0.7, position = position_dodge(width = 0.3)) + 
    scale_x_discrete(labels = parse(text = as.character(unique(dflong$N)))) + 
    scale_y_continuous('', breaks = seq(0,100,25), labels = paste(seq(0,100,25),'%')) + 
    scale_color_manual('', values = c('red','blue'), 
        labels = c('Percentage of selfloop','Percentage of multilinks')) + 
    theme_minimal(base_size = 14) 

這給:

enter image description here

予使用,以便透明度(alpha = 0.7),以便能夠看到點重疊。


在回答您的意見和問題的第二個例子:

你必須改變GGPLOT2代碼位:

  • 更改x變量在aes到一個因素。
  • 不再需要爲標籤解析文本,因此可以刪除該部分。
  • 調整y值中的值和斷點。

下面的代碼:

ggplot(dflong, aes(x = factor(N), y = value, color = variable)) + 
    geom_point(size = 5, alpha = 0.5, position = position_dodge(width = 0.3)) + 
    xlab('N') + 
    scale_y_continuous('', breaks = seq(0, 20, 5), 
        labels = paste(seq(0, 20, 5), '%'), 
        limits = c(0,20)) + 
    scale_color_manual('', 
        values = c('red', 'blue'), 
        labels = c('Percentage of selfloop','Percentage of multilinks')) + 
    theme_minimal(base_size = 14) 

會給你:

enter image description here


使用的數據:

df <- structure(list(N = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("10^3", "10^4", "10^5"), class = "factor"), 
        perSelf = c(2L, 5L, 98L, 50L, 41L, 21L, 36L, 70L, 80L, 100L, 2L, 5L, 100L, 50L, 51L, 21L, 36L, 70L, 73L, 100L, 100L, 5L, 98L, 50L, 41L, 21L, 36L, 65L, 80L, 100L), 
        perMul = c(1L, 1L, 15L, 51L, 52L, 100L, 80L, 20L, 55L, 44L, 1L, 18L, 20L, 51L, 52L, 100L, 80L, 20L, 85L, 98L, 10L, 1L, 15L, 51L, 52L, 85L, 80L, 20L, 55L, 44L)), 
       .Names = c("N", "perSelf", "perMul"), class = "data.frame", row.names = c(NA, -30L)) 
+0

謝謝,我試過你的代碼,它似乎幾乎完美。我修改了主要信息,結果我得到了,你會知道幫助我嗎? – marielle

+0

@marielle你還可以包含你用來製作劇情的代碼嗎?僅僅看情節本身,很難說出什麼問題。 – Jaap

+0

當然(抱歉)。我編輯我的主要信息。 – marielle