Почему не работает scale_edge_width_identity(guide = «легенда»)?

#r #ggplot2 #plot #ggraph

#r #ggplot2 #график #ggraph

Вопрос:

Я использую ggraph для построения двух сетей, содержащих узлы и ребра разного размера и ширины соответственно.

Я хочу поддерживать абсолютные размеры узлов и ребер, используя scale_size_identity() и scale_edge_width_identity() .

Я хотел бы отобразить легенды и использую scale_size_identity(legend = "guide") для узлов, что работает должным образом, но для ребер scale_edge_width_identity(legend = "guide") я получаю следующую ошибку:

 Error: Continuous value supplied to discrete scale
 

Если я не предоставляю legend = "guide" to scale_edge_width_identity() , все работает. Переменная, которую я масштабирую, является числовой. Эта проблема также возникает, если я использую scale_edge_alpha_identity(legend = "guide") Why is this и есть ли какой-либо способ, которым я все еще могу показывать легенды? Ценю любые предложения.

ОБНОВЛЕНИЕ: это работает с предложением @teunbrand ниже. Однако я заметил, что scale_size_continuous() для масштабирования размера узла такой подход не работает. Используйте scale_radius() вместо:

 # building on example by @teunbrand
library(ggraph)
#> Loading required package: ggplot2
require(tidygraph)
#> Loading required package: tidygraph
#> 
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#> 
#>     filter
library(patchwork)

gr <- create_notable("bull")
layout <- create_layout(gr, layout = "igraph", algorithm = "kk")

edge_guide <- guide_legend()

# Edges are plotted using the same scale but nodes are not when scale_size_continuous() is used.
# Notice the differently sized nodes between the legend guides:
ggraph(layout)  
  geom_node_point(aes(size = seq(1, 5, length.out = 5)))  
  geom_edge_link(aes(edge_width = seq(1, 5, length.out = 5)))  
  scale_size_continuous(range = c(1, 5), breaks = c(1, 3, 5))  
  scale_edge_width_continuous(range = c(1, 5), breaks = c(1, 2, 3)) |
ggraph(layout)  
  geom_node_point(aes(size = seq(1, 10, length.out = 5)))  
  geom_edge_link(aes(edge_width = seq(1, 10, length.out = 5)))  
  scale_size_continuous(range = c(1, 10), breaks = c(1, 3, 5))  
  scale_edge_width_continuous(range = c(1, 10), breaks = c(1, 2, 3)) 
 

plotOutput1

 # However, using scale_radius() instead does the job:
ggraph(layout)  
  geom_node_point(aes(size = seq(1, 5, length.out = 5)))  
  geom_edge_link(aes(edge_width = seq(1, 5, length.out = 5)))  
  scale_radius(range = c(1, 5), breaks = c(1, 3, 5))  
  scale_edge_width_continuous(range = c(1, 5), breaks = c(1, 2, 3)) |
ggraph(layout)  
  geom_node_point(aes(size = seq(1, 10, length.out = 5)))  
  geom_edge_link(aes(edge_width = seq(1, 10, length.out = 5)))  
  scale_radius(range = c(1, 10), breaks = c(1, 3, 5))  
  scale_edge_width_continuous(range = c(1, 10), breaks = c(1, 2, 3)) 


Created on 2020-12-04 by the reprex package (v0.3.0)
 

plotOutput2

Ответ №1:

Я получаю путаницу, и это может быть ошибкой, но вот обходные пути. Обходной путь заключается в том, чтобы в основном использовать _continuous() версию весов для имитации _identity() версии как можно ближе, устанавливая диапазон в точном диапазоне данных.

 library(ggraph)
#> Loading required package: ggplot2
require(tidygraph)
#> Loading required package: tidygraph
#> 
#> Attaching package: 'tidygraph'
#> The following object is masked from 'package:stats':
#> 
#>     filter

gr <- create_notable('bull')
layout <- create_layout(gr, layout = 'igraph', algorithm = 'kk')

edge_guide <- guide_legend()

ggraph(layout)  
  geom_node_point()  
  geom_edge_link(aes(edge_width = 1:5))  
  scale_edge_width_continuous(range = c(1, 5))
 

 ggraph(layout)  
  geom_node_point()  
  geom_edge_link(aes(edge_alpha = seq(0.1, 1, length.out = 5)))  
  scale_edge_alpha_continuous(range = c(0.1, 1))
 

Создано 2020-12-03 пакетом reprex (версия 0.3.0)