我想移动边缘标签的位置,使其不在它的顶部.这是一个小例子:
g <- graph.empty(n=3)
g <- graph(c(1,2,3,2,1,3), directed=T)
E(g)$weight <- c(3,2,5)
plot(g, edge.label = E(g)$weight)
Run Code Online (Sandbox Code Playgroud)
在我的例子中,标签位于边缘,我希望它们垂直于边缘移动一点点.
我有一个使用igraph制作的图表.我想分散节点.到目前为止我找到的唯一方法是缩放布局并强制绘图命令不重新缩放.
png("kmeansColouredNetwork.png", width=1200,height = 1000)
col=c("yellow", "saddlebrown", "brown1","chartreuse2", "chocolate1","darkorange" ,"deepskyblue1", "hotpink1","plum2")
for(i in 1:9){
V(graph)$cluster[which(V(graph)$name %in% kmeans[,i])]<-col[i]
}
V(graph)$color=V(graph)$cluster
coords <- layout.fruchterman.reingold(graph)*0.5
plot(graph, layout = coords, vertex.label=NA, rescale=FALSE, vertex.size=degree(graph)*.25,vertex.color=V(graph)$cluster)
labels = paste("cluster:", 1:length(colours))
legend("left",legend=labels, col=col, pch=16, title="K means clustered subgroups")
dev.off()
Run Code Online (Sandbox Code Playgroud)
如果我不重新缩放,中央高度连接的节点聚集在一起,我得到一个这样的图形,其中图形体内的模式无法辨别:

另一方面,如果我告诉plot命令不要重新缩放,那么我得到这个:

图案可辨别的地方,但图表的一半不在图中.这不是绘图大小的问题,就好像我增加了png的尺寸一样,它仍然将图形置于绘图边缘的中心.
这不是布局的问题 - 我尝试过fruchterman.reingold,layout_nicely,reingold.tilford,layout.circle,布局随机,同样的事情发生了.
显然曾经有一个变量来设置节点之间的排斥因子,但这似乎已被弃用.
如何将图表的节点展开或重新缩放并重新定位图?
我有一个未加权的图形,我想得到一个子图,它只包含节点和边,包含n个已知节点之间的最短路径.在这种情况下,3个节点(11,29和13是名称).
如何获得R中n个节点之间最短路径的子图?
library(ggraph)
library(igraph)
hs <- highschool[highschool$year == '1958',]
set.seed(11)
graph <- graph_from_data_frame(hs[sample.int(nrow(hs), 60),])
# plot using ggraph
ggraph(graph, layout = 'kk') +
geom_edge_fan() +
geom_node_text(aes(label = name))
Run Code Online (Sandbox Code Playgroud)
所需的输出将是以下绿色子图(或者关闭,我正在观察上面的图形并在视觉上挑选出子图的内容)忽略/移除其他节点和边缘.
autocurve.edges在igraph图中弯曲边缘做了一个了不起的工作,这样当它们指向同一方向时它们不会重叠.但是,当它们指向相反的方向时,不会施加曲率.
d <- data.frame(start=c("a","a","b","c"),end=c("b","b","c","b"))
graph <- graph.data.frame(d, directed=T)
plot(graph,
vertex.color="white")
Run Code Online (Sandbox Code Playgroud)

问题是b和c(或c和b)之间的箭头.
除了手动指定曲率,任何建议?
我试图将图形(G)中的两个节点(称为"V"和"U")合并为单个节点(V).
G是779个节点(网站)的超链接网络.每条边代表一个超链接.V和U实际上是同一个网站,但不幸的是,该网站的网页已分成两个独立的节点.所以我想把它们放回一个节点.
我已经研究了contract.vertices函数,但我无法理解如何在这里进行调整.
以下是我的图表(G)的属性.
> G
IGRAPH D--- 779 3544 --
+ attr: Image File (v/c), Ringset (v/n), Country Code TLD (v/n), Generic TLD (v/n), Number of Pages (v/n), Categorical 1 (v/n), Categorical 2 (v/n),
Categorical 3 (v/n), id (v/c), label (v/c), Width (e/n)
Run Code Online (Sandbox Code Playgroud)
我有两个节点要合并在一起:
> V(g)$id[8]
[1] "http://www.police.uk/"
Run Code Online (Sandbox Code Playgroud)
和
> V(g)$id[14]
[1] "http://police.uk/"
Run Code Online (Sandbox Code Playgroud)
总共有779个节点和3544个边缘.
我希望这两个节点成为图中的单个节点(即它们将具有相同的"id").来自/到其他节点的所有链接和外链现在将仅指向这个新的单个节点.
除了Number of Pages(它的值将是合并之前的两个节点的总和)之外,所有其他属性将保持不变.
假设我想用以下数据制作一个图:
pairs <- c(1, 2, 2, 3, 2, 4, 2, 5, 2, 6, 2, 7, 2, 8, 2, 9, 2, 10, 2, 11, 4,
14, 4, 15, 6, 13, 6, 19, 6, 28, 6, 36, 7, 16, 7, 23, 7, 26, 7, 33,
7, 39, 7, 43, 8, 35, 8, 40, 9, 21, 9, 22, 9, 25, 9, 27, 9, 33, 9,
38, 10, 12, 10, 18, 10, 20, 10, 32, 10, 34, 10, 37, 10, 44, 10, 45,
10, …Run Code Online (Sandbox Code Playgroud) 我有一个相当大(但相当稀疏)的邻接矩阵(500x500),我试图在视觉上代表.在我看来,类似于力导向图的东西是我最好的选择,在尝试找出实现它的最佳方法时,我遇到了R的多个资源.最有帮助的是http:/上的网络可视化/kateto.net/network-visualization虽然我之前从未使用过R,但它似乎有很多有用的功能可用于这种可视化.
我已设法在下面生成一个图,但图像相当小,节点堆叠.
如果我打印到pdf而不是PNG,分辨率会略好一些,但我仍然存在堆叠问题.因此,我的问题是,如何在R中正确绘制一个大的邻接矩阵来解决这些问题.
到目前为止我的代码如下(最后几行我尝试绘制数据的几种不同方式).任何提示都非常感谢.先感谢您.
为方便起见,我在https://github.com/BStricklin/DataViz上传了我的GitHub引用的两个文件.
plot.new()
library('igraph')
setwd("D:/Downloads/polnet2016/Data files")
nodes2 <- read.csv("nodes.csv", header=T, as.is=T)
links2 <- read.csv("nodeAdjacency.csv", header=T, row.names=1)
links2 <- as.matrix(links2)
head(nodes2)
head(links2)
net2 <- graph_from_incidence_matrix(links2)
net2 <- graph_from_adjacency_matrix(links2, mode = "undirected", weighted = TRUE)
net2 <- simplify(net2, remove.multiple = F, remove.loops = T)
V(net2)$label <- nodes2$id
deg <- degree(net2, mode="all")
V(net2)$size <- deg*3
#plot(net2)
#plot(net2, edge.label=round(E(net2)$weight, 3))
layout <- layout.reingold.tilford(net2)
#plot.igraph(net2,vertex.size=3,layout=layout.lgl)
plot.igraph(net2,vertex.size=3,vertex.label.cex=.5,layout=layout.fruchterman.reingold(net2, niter=10000))
Run Code Online (Sandbox Code Playgroud)
编辑:对于任何想知道我最终如何做到这一点的人,我不得不使用MATLAB并利用图形和绘图功能.它看起来像R图像一样令人讨厌,但是通过一些节点的自定义和缩放功能的使用,它运行得很好.我仍然会对如何在R中这样做感兴趣.
以下代码生成一个很好的网络图:
library(igraph);library(visNetwork);library(dplyr)
set.seed(123)
nnodes <- 10
nnedges <- 20
nodes <- data.frame(id = 1:nnodes)
edges <- data.frame(from = sample(1:nnodes, nnedges, replace = T),
to = sample(1:nnodes, nnedges, replace = T))
visNetwork(nodes, edges) %>%
visIgraphLayout(layout = "layout_in_circle") %>%
visNodes(shape="circle") %>%
visOptions(highlightNearest = list(enabled = T, hover = T), nodesIdSelection = T)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何禁用从相邻节点离开的边缘(例如,当选择节点8时,我不希望显示从3到9的边缘).
编辑:添加了库,thx for poining that out
我有以下脚本:
import pandas as pd
from igraph import *
df_p_c = pd.read_csv('data/edges.csv')
...
edges = list_edges
vertices = list(dict_case_to_number.keys())
g = Graph(edges=edges, directed=True)
plot(g, bbox=(6000, 6000))
Run Code Online (Sandbox Code Playgroud)
我有2300个边缘与稀有连接.这是我的情节:
以下是它的一些部分的缩放:
此图不可读,因为边之间的距离太小.如何在边缘之间留出更大的距离?只有来自同一"家庭"的边缘距离很小.
有没有其他方法来改善有很多边缘的情节?我正在寻找任何可视化父子关系的方法,它可能是另一个python包.
igraph ×10
r ×8
algorithm ×2
plot ×2
python ×2
ggraph ×1
graph-theory ×1
label ×1
matplotlib ×1
python-3.x ×1
visnetwork ×1