标签: ggraph

在ggraph中使用经纬度数据进行布局时出现问题

我试图弄清楚如何在其中使用经/纬度布局,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)

坐标位置的简单图如下所示: …

r igraph ggraph

5
推荐指数
1
解决办法
580
查看次数

如何控制ggraph中的节点颜色?

我有一个网络图,我想为边着色以匹配它们各自的节点。这在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)

r colors nodes ggraph

5
推荐指数
1
解决办法
5055
查看次数

通过从位置数据创建边缘列表来使 data.frame igraph 兼容

我目前正在开展一个项目,该项目将智库董事会成员及其各自的董事会网络可视化。我拥有的数据采用以下格式:

     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)

r igraph ggraph

5
推荐指数
1
解决办法
62
查看次数

如何读取 ggraph 径向图中的文本标签

在 中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)

r ggplot2 ggraph ggforce

4
推荐指数
1
解决办法
779
查看次数

使用 ggraph/ggplot2 在网络图中定位节点和边

我试图用 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)

networking r igraph ggplot2 ggraph

4
推荐指数
1
解决办法
1373
查看次数

如何在r中的ggraph网络中按权重调整边的宽度

我需要在 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)

r igraph network-analysis ggraph

4
推荐指数
1
解决办法
6767
查看次数

igraph 对象可以有有向边和无向边吗?

我正在尝试使用 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)。

谢谢!

r graph igraph ggraph

4
推荐指数
1
解决办法
801
查看次数

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)

r ggplot2 ggraph

3
推荐指数
1
解决办法
3360
查看次数

在网络图中放置循环的 R 自动过程

我的目标是绘制一个包含循环的圆形网络,即边的起点和终点位于同一节点。如果节点之间有很多连接,就会出现循环总是画在右侧的问题。这会导致非常不愉快的图形呈现。对于小型网络,这可以手动计算(参见例如这篇文章)。

然而,对于可能并不总是包含相同环路的大型网络来说,这变得更加困难。因此,我正在寻找一种自动化的方法(而不是提到的手动过程)来将循环始终放置在网络的外部,以确保它们不会与图中的边缘重叠。

此问题的示例如下所示,其中,特别是节点“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)

r igraph ggraph

3
推荐指数
1
解决办法
159
查看次数

ggraph中相同网络的不同布局之间的平滑过渡

我想使用不同的布局为同一个网络设置动画,并使布局之间平滑过渡。我想在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)

r igraph ggplot2 gganimate ggraph

2
推荐指数
1
解决办法
251
查看次数

特定geom_node_text的绘图标签

我正在尝试绘制网络图,并仅显示具有高于特定阈值的中心得分的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)

r ggplot2 ggraph tidygraph

1
推荐指数
2
解决办法
932
查看次数