在 R 中使用 tidy graph 时按变量着色?
Colouring by variable when using tidy graph in R?
我正在尝试想出一种方法来一致地为多个 tidygraph
图着色。现在,问题是,当我一次在屏幕上绘制多个图时,tidygraph
为每个变量选择不同的颜色。希望我下面的例子能解释这个问题。
首先,我创建了一些数据,将它们变成 tidygraph
个对象,然后将它们放在一个列表中:
library(tidygraph)
library(ggraph)
library(gridExtra)
# create some data for the tbl_graph
nodes <- data.frame(name = c("x4", NA, NA),
label = c("x4", 5, 2))
nodes1 <- data.frame(name = c("x4", "x2", NA, NA, "x1", NA, NA),
label = c("x4", "x2", 2, 1, "x1", 2, 7))
edges <- data.frame(from = c(1,1), to = c(2,3))
edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5),
to = c(2, 3, 4, 5, 6, 7))
# create the tbl_graphs
tg <- tbl_graph(nodes = nodes, edges = edges)
tg_1 <- tbl_graph(nodes = nodes1, edges = edges1)
# put into list
myList <- list(tg, tg_1)
然后我有一个绘图功能,可以让我一次显示所有的绘图。我使用 gridExtra
包中的 grid.arrange
来执行此操作,如下所示:
plotFun <- function(List){
ggraph(List, "partition") +
geom_node_tile(aes(fill = name), size = 0.25) +
geom_node_label(aes(label = label, color = name)) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
}
# Display all plots
allPlots <- lapply(myList, plotFun)
n <- length(allPlots)
nRow <- floor(sqrt(n))
do.call("grid.arrange", c(allPlots, nrow = nRow))
这将产生如下内容:
如您所见,它为每个单独的绘图按变量 label
着色。这导致同一变量 label
在每个图中的颜色不同。例如,第一个图中的 x4
是红色,第二个图中是蓝色。
我正在尝试找到一种方法,使变量 label
的颜色在所有绘图中保持一致。也许使用 grid.arrange
不是最好的解决方案!?
感谢任何帮助。
由于每个图对其他图一无所知,所以最好自己分配颜色。首先,您可以提取所有节点名称并为它们分配颜色
nodenames <- unique(na.omit(unlist(lapply(myList, .%>%activate(nodes) %>% pull(name) ))))
nodecolors <- setNames(scales::hue_pal(c(0,360)+15, 100, 64, 0, 1)(length(nodenames)), nodenames)
nodecolors
# x4 x2 x1
# "#F5736A" "#00B734" "#5E99FF"
我们使用 scales::hue_pal
来获取“默认”ggplot 颜色,但您可以使用任何您喜欢的颜色。然后我们只需要为这些颜色的图自定义 color/fill 比例。
plotFun <- function(List, colors=NULL){
plot <- ggraph(List, "partition") +
geom_node_tile(aes(fill = name), size = 0.25) +
geom_node_label(aes(label = label, color = name)) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
if (!is.null(colors)) {
plot <- plot + scale_fill_manual(values=colors) +
scale_color_manual(values=colors, na.value="grey")
}
plot
}
allPlots <- lapply(myList, plotFun, colors=nodecolors)
n <- length(allPlots)
nRow <- floor(sqrt(n))
do.call("grid.arrange", c(allPlots, nrow = nRow))
我正在尝试想出一种方法来一致地为多个 tidygraph
图着色。现在,问题是,当我一次在屏幕上绘制多个图时,tidygraph
为每个变量选择不同的颜色。希望我下面的例子能解释这个问题。
首先,我创建了一些数据,将它们变成 tidygraph
个对象,然后将它们放在一个列表中:
library(tidygraph)
library(ggraph)
library(gridExtra)
# create some data for the tbl_graph
nodes <- data.frame(name = c("x4", NA, NA),
label = c("x4", 5, 2))
nodes1 <- data.frame(name = c("x4", "x2", NA, NA, "x1", NA, NA),
label = c("x4", "x2", 2, 1, "x1", 2, 7))
edges <- data.frame(from = c(1,1), to = c(2,3))
edges1 <- data.frame(from = c(1, 2, 2, 1, 5, 5),
to = c(2, 3, 4, 5, 6, 7))
# create the tbl_graphs
tg <- tbl_graph(nodes = nodes, edges = edges)
tg_1 <- tbl_graph(nodes = nodes1, edges = edges1)
# put into list
myList <- list(tg, tg_1)
然后我有一个绘图功能,可以让我一次显示所有的绘图。我使用 gridExtra
包中的 grid.arrange
来执行此操作,如下所示:
plotFun <- function(List){
ggraph(List, "partition") +
geom_node_tile(aes(fill = name), size = 0.25) +
geom_node_label(aes(label = label, color = name)) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
}
# Display all plots
allPlots <- lapply(myList, plotFun)
n <- length(allPlots)
nRow <- floor(sqrt(n))
do.call("grid.arrange", c(allPlots, nrow = nRow))
这将产生如下内容:
如您所见,它为每个单独的绘图按变量 label
着色。这导致同一变量 label
在每个图中的颜色不同。例如,第一个图中的 x4
是红色,第二个图中是蓝色。
我正在尝试找到一种方法,使变量 label
的颜色在所有绘图中保持一致。也许使用 grid.arrange
不是最好的解决方案!?
感谢任何帮助。
由于每个图对其他图一无所知,所以最好自己分配颜色。首先,您可以提取所有节点名称并为它们分配颜色
nodenames <- unique(na.omit(unlist(lapply(myList, .%>%activate(nodes) %>% pull(name) ))))
nodecolors <- setNames(scales::hue_pal(c(0,360)+15, 100, 64, 0, 1)(length(nodenames)), nodenames)
nodecolors
# x4 x2 x1
# "#F5736A" "#00B734" "#5E99FF"
我们使用 scales::hue_pal
来获取“默认”ggplot 颜色,但您可以使用任何您喜欢的颜色。然后我们只需要为这些颜色的图自定义 color/fill 比例。
plotFun <- function(List, colors=NULL){
plot <- ggraph(List, "partition") +
geom_node_tile(aes(fill = name), size = 0.25) +
geom_node_label(aes(label = label, color = name)) +
scale_y_reverse() +
theme_void() +
theme(legend.position = "none")
if (!is.null(colors)) {
plot <- plot + scale_fill_manual(values=colors) +
scale_color_manual(values=colors, na.value="grey")
}
plot
}
allPlots <- lapply(myList, plotFun, colors=nodecolors)
n <- length(allPlots)
nRow <- floor(sqrt(n))
do.call("grid.arrange", c(allPlots, nrow = nRow))