以下代码生成一个很好的网络图:
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
在精神上类似于边缘组和在R中的visNetwork中选择,我想知道如何基于边缘而不是使用visNetwork包的节点创建下拉列表.我认为这是可能的visSetSelection功能,但这需要使用闪亮.我用降价渲染的html提供最终产品,而不是从服务器部署它,所以我不认为这是可能的.
有没有办法在闪亮之外复制这个功能?我不完全理解文档中的术语,但我认为我想要做的是类似于函数中nodeIdSelection的selectedBy参数visOptions,你可以创建一个"HTML选择元素",但是基于边缘列表而不是节点列表.
这个特定问题的数据集是专有的,但这里有一些虚拟数据.我希望能够通过边缘的"重量"进行选择.
library(tidyverse)
library(visNetwork)
nodes <- tibble(id = 1:30)
edges <- tibble(from = c(21:30, 1:20),
to = c(5:20, 21:30, 1:4),
weight = c(rep(1:5, 6)))
visNetwork(nodes, edges) %>%
visIgraphLayout(layout = "layout_in_circle") %>%
visOptions(highlightNearest = list(enabled = T,
hover = T,
degree = 1,
algorithm = "hierarchical"),
nodesIdSelection = T)
Run Code Online (Sandbox Code Playgroud)
我所期待的是一个edgesIdSelection争论,visOptions但这不是一个选择.我认为管道visSelectEdges可以工作,但只适用于闪亮,我的客户端无法访问闪亮的服务器.我知道这个库是为了让javascript库可以通过R访问所以我不希望完整的功能 - 如果我不能在R中使用这个包(没有闪亮),我完全明白了.
我模拟了一些数据并使用 visnetwork 在 R 中创建了一个图形网络:
library(igraph)
library(dplyr)
library(visNetwork)
#create file from which to sample from
x5 <- sample(1:100, 1100, replace=T)
#convert to data frame
x5 = as.data.frame(x5)
#create first file (take a random sample from the created file)
a = sample_n(x5, 1000)
#create second file (take a random sample from the created file)
b = sample_n(x5, 1000)
#combine
c = cbind(a,b)
#create dataframe
c = data.frame(c)
#rename column names
colnames(c) <- c("a","b")
#create graph
graph <- graph.data.frame(c, directed=F)
graph <- …Run Code Online (Sandbox Code Playgroud) 我正在使用 visNetwork(用于其动态可视化)来可视化具有 47 个节点的二部图。
visNetwork(nodes, edges) %>%
visIgraphLayout(layout = 'layout.davidson.harel')
Run Code Online (Sandbox Code Playgroud)
上图是目前的样子,这是我们在尝试了一些布局(Fruchterman Reingold 等)后能想到的最好的结果。我遇到的问题是边往往很长,所以一些节点对相距很远。任何人都可以建议一种防止节点与边缘重叠的布局吗?
如何用饼图替换 visnetwork 渲染图中的顶点形状?我知道 igraph 可以通过绘图函数和顶点形状饼来实现这一点http://igraph.org/r/doc/vertex.shape.pie.html。visnetwork 中的等价物是什么?
我使用该包创建了一个网络图visNetwork(抱歉,我对其他语言知之甚少)。
我想要两点(请看左下图)
我可以用 R 来做吗?
任何帮助将不胜感激。下面是示例代码和输出:
library(dplyr); library(visNetwork)
visNetwork(nodes = data_frame(id = 1:3,
label = c("abcdef", "xxx", "y"),
shape = "box"),
edges = data_frame(from = c(1, 1, 2),
to = c(2, 3, 3),
arrows = "to")) %>%
visNodes(font = list(size = 17),
color = list(background = "aliceblue", border = "darkblue")) %>%
visEdges(width = 2) %>%
visIgraphLayout(layout = "layout_nicely")
Run Code Online (Sandbox Code Playgroud)
当我从下拉列表中选择一组节点时,我希望也突出显示距离最近的一度节点。目前,仅突出显示组中的节点。
我认为程度= 1的highlightNearest会有所帮助,但这似乎只影响选择单个节点的情况,而不影响选择组的情况。
library(visNetwork)
nb <- 10
nodes <- data.frame(
id = 1:nb, label = paste("Label", 1:nb),
group = sample(LETTERS[1:3], nb, replace = TRUE), value = 1:nb,
title = paste0("<p>", 1:nb, "<br>Tooltip !</p>"), stringsAsFactors = FALSE
)
edges <- data.frame(
from = c(8, 2, 7, 6, 1, 8, 9, 4, 6, 2),
to = c(3, 7, 2, 7, 9, 1, 5, 3, 2, 9),
value = rnorm(nb, 10), label = paste("Edge", 1:nb),
title = paste0("<p>", 1:nb, "<br>Edge Tooltip !</p>")
) …Run Code Online (Sandbox Code Playgroud) 我制作了以下 25 个网络图(为了简单起见,所有这些图都是复制品 - 实际上,它们都会有所不同):
library(tidyverse)
library(igraph)
set.seed(123)
n=15
data = data.frame(tibble(d = paste(1:n)))
relations = data.frame(tibble(
from = sample(data$d),
to = lead(from, default=from[1]),
))
data$name = c("new york", "chicago", "los angeles", "orlando", "houston", "seattle", "washington", "baltimore", "atlanta", "las vegas", "oakland", "phoenix", "kansas", "miami", "newark" )
graph = graph_from_data_frame(relations, directed=T, vertices = data)
V(graph)$color <- ifelse(data$d == relations$from[1], "red", "orange")
plot(graph, layout=layout.circle, edge.arrow.size = 0.2, main = "my_graph")
library(visNetwork)
a = visIgraph(graph)
m_1 = 1
m_2 = 23.6
a = …Run Code Online (Sandbox Code Playgroud) 我有这个graphML文件,它是用 yworks yEd 创建的。
现在我想将此文件读入 R 以通过visNetwork. 但是使用该igraph::read_graph函数将文件读入 R失败:
library(igraph)
example <- igraph::read_graph("data/graphml_example.graphml", format = "graphml")
Run Code Online (Sandbox Code Playgroud)
警告信息:
1:在 read.graph.graphml(file, ...) 中:在 foreign-graphml.c:651 中:由于缺少或未知的“attr.type”属性而忽略
...
这是graphml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--Created by yFiles for HTML 2.0.1.4-->
<graphml xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml.html/2.0/ygraphml.xsd " xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:demostyle="http://www.yworks.com/yFilesHTML/demos/FlatDemoStyle/1.0" xmlns:bpmn="http://www.yworks.com/xml/yfiles-for-html/bpmn/2.0" xmlns:demotablestyle="http://www.yworks.com/yFilesHTML/demos/FlatDemoTableStyle/1.0" xmlns:compat="http://www.yworks.com/xml/yfiles-compat-arrows/1.0" xmlns:VuejsNodeStyle="http://www.yworks.com/demos/yfiles-vuejs-node-style/1.0" xmlns:y="http://www.yworks.com/xml/yfiles-common/3.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/3.0" xmlns:yjs="http://www.yworks.com/xml/yfiles-for-html/2.0/xaml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<key id="d0" for="node" attr.type="boolean" attr.name="Expanded" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/folding/Expanded">
<default>true</default>
</key>
<key id="d1" for="node" attr.name="NodeLabels" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/NodeLabels"/>
<key id="d2" for="node" attr.name="NodeGeometry" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/NodeGeometry"/>
<key id="d3" for="all" attr.name="UserTags" y:attr.uri="http://www.yworks.com/xml/yfiles-common/2.0/UserTags"/>
<key id="d4" …Run Code Online (Sandbox Code Playgroud) 我有以下组件:
const ParentComponent: React.FC = () => {
const networkRef: any = useRef();
// Somewhere in the code, I call this
networkRef.current.filter(["id0, id1, id2"]);
return (
...
<VisNetwork
ref={networkRef}
/>
...
)
}
export default ParentComponent;
interface Props {
ref: any;
}
const VisNetwork: React.FC<Props> = forwardRef((props: Props, ref) => {
useImperativeHandle(ref, () => ({
filter(items: any) {
setFilterNodes(items);
nView.refresh();
}
}));
const [filterNodes, setFilterNodes] = useState<any[]>([]);
const filterNodesRef = useRef(filterNodes);
useEffect(() => {
filterNodesRef.current = filterNodes;
}, [filterNodes]);
... …Run Code Online (Sandbox Code Playgroud) visnetwork ×10
r ×8
igraph ×4
graph ×2
javascript ×2
graphml ×1
pie-chart ×1
popup ×1
reactjs ×1
typescript ×1