Saya bekerja dengan jaringan besar dan ingin juga menyorot node tertentu. Saya ingin node ini diplot di atas jaringan yang padat. Mereka saat ini diidentifikasi dengan warna tertentu. Berikut adalah beberapa contoh kode sederhana.

library(network)
library(GGally)

# make a random network
x <- c(0,1,0,1,1,1,0,1,0,1,0,1)
seed <- c(10,25,40,34,1,35,6,3,14,5,23,3)
net <- data.frame(matrix(nrow = 12, ncol = 12))
for (i in 1:12) {
  set.seed(seed[i])
  net[i] <- sample(x)
}

#plot it with two colors
plot = as.network(net,
                 directed = FALSE,
                 ignore.eval = FALSE,
                 names.eval = 'R_val')

color <- c("yes","yes","no","no","no","no","no","no","no","no","no","no")
final <- ggnet2(net,size = 25,color = color,label = TRUE)

enter image description here

Saya benar-benar melebih-lebihkan ukuran titik di sini untuk membuatnya tumpang tindih. Apakah ada cara saya bisa mendapatkan poin "ya" untuk selalu berada di atas poin "tidak"?

EDIT: Menambahkan "label" untuk kejelasan.

0
Henry Holm 20 November 2020, 20:02

1 menjawab

Jawaban Terbaik

Ya ada! Vektor color Anda pertama-tama menunjukkan "ya" dan kemudian "tidak", yang tampaknya menentukan urutan plot. Dengan asumsi Anda memiliki lebih dari "ya" atau "tidak", Anda dapat mencoba mengonversi vektor color menjadi faktor dan menetapkan level. Kemudian Anda dapat mengurutkan urutan "ya" dan "tidak" Anda:

color <- c("yes","yes","no","no","no","no","no","no","no","no","no","no")
factor_color <- sort(factor(color, levels = c("no", "yes")))
ggnet2(net, size = 100, color = factor_color)

enter image description here

EDIT 1

Sesuai komentar Anda, saya tidak dapat memikirkan solusi (lebih) yang elegan, tetapi ini berfungsi untuk saya:

#plot it with two colors
plot = as.network(net,
                  directed = FALSE,
                  ignore.eval = FALSE,
                  names.eval = 'R_val')

color <- c("yes","yes","no","no","no","no","no","no","no","no","no","no")
final <- ggnet2(net,size = 100, color = color, label = TRUE)
final_build <- ggplot2::ggplot_build(final)

# Extract the geom_point data and find which elements have 'yes'
yes_index <- which(color == "yes")
label_data <- final_build$data[[2]]
yes_coordinates_label <- cbind(label_data[yes_index,], label = names(net)[yes_index])

final + 
  geom_point(data = yes_coordinates_label, aes(x = x, y = y),
             size = 100, color = first(yes_coordinates_label$colour)) +
  geom_text(data = yes_coordinates_label, aes(x = x, y = y, label = label))

Idenya adalah untuk memplot titik-titik dengan geom_point() lagi tetapi hanya untuk titik-titik yang "ya".

EDIT 2

Mau tak mau saya memikirkan solusi lain tanpa merencanakan poin lagi. Dimungkinkan untuk mengambil informasi plot menggunakan ggplot_build() dan kemudian menyusun ulang hierarki titik yang ditarik; titik data yang datang lebih dulu ditarik terlebih dahulu. Karenanya melakukan hal berikut akan berhasil:

library(tidyverse)

# Find the index of the GeomPoint layer
geom_types <- final$layers %>% map("geom") %>% map(class)
GeomPoint_ind <- which(sapply(geom_types, function(x) "GeomPoint" %in% x))

# Retrieve plot information
final_build <- ggplot2::ggplot_build(final)
df <- final_build$data[[GeomPoint_ind]]

# Set the indices which you would like to have on top and modify the ggplot_build object. 
yes_index <- which(color == "yes")
final_build$data[[2]] <- rbind(df[-yes_index,], df[yes_index,])

# Convert to plot object and plot
new_final <- ggplot_gtable(final_build)
plot(new_final)
1
PLY 23 November 2020, 12:50