#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))
# 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)
Ответ №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)