我试图弄清楚如何在其中使用经/纬度布局,ggraph
但似乎无法通过语法正常工作。考虑此reprex,并从iris
数据集中修改了一些数据:
data <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6,
5, 4.4, 4.9, 5.4, 4.8), Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6,
3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4), Lon = c(-122.683, -122.688,
-122.686, -122.683, -122.678, -122.675, -122.674, -122.673, -122.676,
-122.674, -122.677, -122.68), Lat = c(45.523, 45.52, 45.514,
45.515, 45.513, 45.514, 45.517, 45.519, 45.519, 45.522, 45.524,
45.521)), class = "data.frame", .Names = c("Sepal.Length", "Sepal.Width",
"Lon", "Lat"), row.names = c(NA, -12L))
library(ggplot2)
library(igraph)
library(ggraph)
Run Code Online (Sandbox Code Playgroud)
坐标位置的简单图如下所示: …
我有一个网络图,我想为边着色以匹配它们各自的节点。这在igraph
情节中相当直接,但我更喜欢这样做,ggraph
因为我喜欢包提供的其他美学。
似乎对ggraph
; 中的节点颜色几乎没有控制。而边缘颜色被广泛覆盖。
我的问题是:如何将我的边与使用自定义函数着色的节点进行匹配,以便“离开”节点的每条边的颜色与其节点相同。这应该有助于人们更轻松地通过网络跟踪流量。一个更普遍的问题是:ggraph 如何在美学论证之外分配颜色。我的问题类似于我之前在这里问过的另一个问题,但反过来(将边与节点匹配),在这里找到。
这是一个可重现的示例:
library(tidyverse)
library(igraph)
library(ggraph)
library(tidygraph)
library(RColorBrewer)
## the custom function using Color Brewer
cols_f <- colorRampPalette(RColorBrewer::brewer.pal(11, 'Spectral'))
## make the graph
g <- erdos.renyi.game(50, .1)
# provide some names
V(g)$name <- 1:vcount(g)
#plot using ggraph
g %>%
as_tbl_graph() %>%
activate(nodes) %>%
mutate(degree = centrality_degree()) %>%
ggraph()+
geom_edge_fan(aes(color = as.factor(from),
alpha = ..index..),
show.legend = F)+
geom_node_point(aes(size = degree),
color = cols_f(vcount(g)), # custom function for node color …
Run Code Online (Sandbox Code Playgroud) 我目前正在开展一个项目,该项目将智库董事会成员及其各自的董事会网络可视化。我拥有的数据采用以下格式:
name edge
1 A 1
2 A 2
3 A 3
4 B 4
5 B 5
6 C 6
Run Code Online (Sandbox Code Playgroud)
但是,为了使其与 igraphsgraph_from_data_frame()
功能兼容,我需要以下格式:
name from to
1 A 1 2
2 A 1 3
3 A 2 3
4 B 4 5
5 C 6 0
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了
df1 <- setDT(df1)[, list(edge = toString(edge)), name]
df1 <- separate(df1, "edge", c("X", "Y", "Z"))
Run Code Online (Sandbox Code Playgroud)
屈服
name X Y Z
1: A 1 2 3
2: B 4 5 <NA>
3: C …
Run Code Online (Sandbox Code Playgroud) 在 中ggraph
,如果绘图是径向的,则无论repel=T
是否使用,标签都会变得拥挤。
有没有办法使标签具有交互性或允许旋转图形以读取标签?
library(ggraph)
mtcarsDen <- as.dendrogram(hclust(dist(mtcars[1:4], method='euclidean'),
method='ward.D2'))
ggraph(graph = mtcarsDen, layout = 'dendrogram', repel = TRUE, circular = TRUE,
ratio = 0.5) +
geom_edge_elbow() +
geom_node_text(aes(x = x*1.05, y=y*1.05, filter=leaf,
angle = node_angle(x, y), label = label),
size=3, hjust='outward') +
geom_node_point(aes(filter=leaf)) +
coord_fixed() +
ggforce::theme_no_axes()
Run Code Online (Sandbox Code Playgroud) 我试图用 ggraph 绘制一个网络,我想在图形周围添加一个圆圈,边缘和节点位于圆圈内。
使用以下代码绘制圆圈效果很好(改编自Draw a circle with ggplot2)
gg_circle <- function(r, xc, yc, color = "black", fill = NA, lty = NA, size = NA, ...) {
x <- xc + r*cos(seq(0, pi, length.out = 100))
ymax <- yc + r*sin(seq(0, pi, length.out = 100))
ymin <- yc + r*sin(seq(0, -pi, length.out = 100))
annotate("ribbon", x = x, ymin = ymin, ymax = ymax,
color = color, fill = fill, lty = lty, size = size, ...)
} …
Run Code Online (Sandbox Code Playgroud) 我需要在 r 中使用 ggraph 生成一个网络。我想要的是通过权重变量(或节点的大小)调整边缘宽度。有谁知道我该怎么做?多谢。
示例代码如下:
library(ggraph)
library(igraph)
data=data.frame(w1=rep('like', 5),
w2 = c('apple', 'orange', 'pear','peach', 'banana'),
weight= c(2,3,5,8, 15))
data %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(alpha = .25) +
geom_node_point(color = "blue", size = 2) +
geom_node_text(aes(label = name), repel = TRUE)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 igraph/ggraph 来绘制一个网络,其中一些边是有向的,而另一些则不是。
我的边缘列表中的一个小例子。这里,蛋白质位点边缘是我想要表示为无向的,而磷酸化边缘是有向的。
df <- data.frame(
stringsAsFactors = FALSE,
from = c("RPS6KA3", "RPS6KA3", "RPS6KA3", "RPS6KA3", "RPS6KA3"),
to = c("RPS6KA3_Y529-p",
"RPS6KA3_S227-p","RPS6KA3_S369-p","RPS6KA3_T577-p","ATF4"),
action = c("protein-site","protein-site",
"protein-site","protein-site","phosphorylation")
)
Run Code Online (Sandbox Code Playgroud)
我尝试对无向边进行子集化并指定它们,但它不起作用:
library(igraph)
nw <- graph_from_data_frame(df)
E(nw)[E(nw)$action == "protein-site"] <- as.undirected(subgraph.edges(nw, E(nw)[E(nw)$action == "protein-site"] ))
Run Code Online (Sandbox Code Playgroud)
有人还有其他建议吗?正如我所说,我真的只想绘制这个(使用 ggraph)。
谢谢!
一直在阅读 Julia Silge 和 David Robinson 所著的 Tidytext Mining with R - https://www.tidytextmining.com/nasa.html - 并且对如何根据频率 (n) 调整节点大小感到困惑。尝试了以下代码...
library(widyr)
set.seed(1234)
title_word_pairs %>%
filter(n >= 250) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = n, edge_width = n), edge_colour =
"royalblue") +
geom_node_point(aes(size = n)) + scale_size(range = c(2,10)) +
geom_node_text(aes(label = name), repel = TRUE,
point.padding = unit(0.2, "lines")) +
theme_void()
Run Code Online (Sandbox Code Playgroud)
...并收到此错误...
Error: Column `size` must be a 1d atomic vector or a list
Call `rlang::last_error()` to see a backtrace …
Run Code Online (Sandbox Code Playgroud) 我的目标是绘制一个包含循环的圆形网络,即边的起点和终点位于同一节点。如果节点之间有很多连接,就会出现循环总是画在右侧的问题。这会导致非常不愉快的图形呈现。对于小型网络,这可以手动计算(参见例如这篇文章)。
然而,对于可能并不总是包含相同环路的大型网络来说,这变得更加困难。因此,我正在寻找一种自动化的方法(而不是提到的手动过程)来将循环始终放置在网络的外部,以确保它们不会与图中的边缘重叠。
此问题的示例如下所示,其中,特别是节点“g”、“h”、“i”以及在某种程度上“j”遭受此问题。该图仅限于包含权重高于 5 的边,以表明并非所有循环都需要始终可用。
网络示例:
重现网络的代码:
# packages
library(ggraph)
library(igraph)
# create example data
set.seed(123)
adj_mat <- matrix(runif(100, 0, 10), nrow=10)
colnames(adj_mat) <- letters[1:10]
# create graph object and remove edges below threshold
g <- graph_from_adjacency_matrix(adj_mat, weighted = T, diag = T)
g <- delete.edges(g, which(E(g)$weight < 5))
# plot
ggraph(g, layout = "circle") +
geom_edge_link() +
geom_edge_loop() +
geom_node_circle(aes(r=0.1), fill = "orange") +
geom_node_text(aes(label = colnames(adj_mat))) +
theme(aspect.ratio = 1)
Run Code Online (Sandbox Code Playgroud) 我想使用不同的布局为同一个网络设置动画,并使布局之间平滑过渡。我想在gganimate
框架内执行此操作。
library(igraph)
library(ggraph)
library(gganimate)
set.seed(1)
g <- erdos.renyi.game(10, .5, "gnp")
V(g)$name <- letters[1:vcount(g)]
l1 <- create_layout(g, "kk")
l2 <- create_layout(g, "circle")
l3 <- create_layout(g, "nicely")
long <- rbind(l1,l2,l3)
long$frame <- rep(1:3, each =10)
Run Code Online (Sandbox Code Playgroud)
按照这种ggplot
方法,我以长格式(long
)存储节点位置,frame
并向每个布局添加一个变量。我试图使其与下面的代码一起使用,它可以正常工作并且几乎是我想要的。但是,我似乎找不到找到包括这些边缘的方法:
ggplot(long, aes(x, y, label = name, color = as.factor(name), frame = frame)) +
geom_point(size = 3, show.legend = F) +
geom_text(show.legend = F) +
transition_components(frame)
Run Code Online (Sandbox Code Playgroud)
我还尝试添加边缘为,geom_segment
但最终在节点保持移动的同时使它们变为静态。这就是为什么我使用该ggraph
程序包并失败的原因:
ggraph(g, layout = "manual", node.position = long) + …
Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制网络图,并仅显示具有高于特定阈值的中心得分的geom_node_text标签。我的代码如下:
rt_tbl %>%
mutate(centrality = centrality_authority()) %>%
ggraph(layout = 'kk') +
geom_edge_link(aes(), colour = "gray", alpha = 0.5) +
geom_node_point(aes(size = centrality, colour = centrality)) +
geom_node_text(data=subset(centrality > 0.6), aes(centrality, label=name)) +
theme_graph(base_family = "Roboto Condensed", base_size = 13)
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误:
Error in subset(centrality > 100) : object 'centrality' not found
Run Code Online (Sandbox Code Playgroud)
我的数据如下所示:
# A tbl_graph: 1589 nodes and 3992 edges
# A directed multigraph with 3 components
# Node Data: 1,589 x 3 (active)
name degree centrality
<chr> <dbl> <dbl>
1 …
Run Code Online (Sandbox Code Playgroud)