我试图sankeyNetwork()
在networkD3包中使用Sankey图.
sankeyNetwork(Links = Flow_data, Nodes = Nodes_data,
Source = "Source_ID", Target = "Target",
Value = "value", NodeID = "Nodes_name",
width = 1000, height=600, fontsize = 16, nodeWidth = 50,
colourScale = "d3.scale.category20c()")
Run Code Online (Sandbox Code Playgroud)
可视化效果很好,但我想将颜色范围更改为单个范围.有没有机会改变SankeyNetwork的颜色?我需要一系列只有3种颜色,我可以自己设置(不是d3.scale的预定义colourScales).
我正在尝试在 R 中生成桑基图,也称为河流图。我见过这个问题Sankey Charts in R? 其中列出了生成桑基图的各种软件包。由于我有输入数据并且知道不同的工具/包,我可以生成这样的图表,但我的疑问是:我如何为此准备输入数据?
假设我们想要展示用户在 10 天内如何在不同状态之间迁移,并具有如下所示的起始数据集:
data.frame(userID = 1:100,
day1_state = sample(letters[1:8], replace = TRUE, size = 100),
day2_state = sample(letters[1:8], replace = TRUE, size = 100),
day3_state = sample(letters[1:8], replace = TRUE, size = 100),
day4_state = sample(letters[1:8], replace = TRUE, size = 100),
day5_state = sample(letters[1:8], replace = TRUE, size = 100),
day6_state = sample(letters[1:8], replace = TRUE, size = 100),
day7_state = sample(letters[1:8], replace = TRUE, size = 100),
day8_state …
Run Code Online (Sandbox Code Playgroud) 我想结合丰富的 html 小部件(主要是plotly和networkD3),以及将它们排列为R网格中的绘图的可能性,将它们导出为出版物的pdf图形。但是,如果我在 R 中创建一些 html 小部件对象并尝试使用gridExtra::grid.arrange()排列它们(请参见下面的最小示例),我会收到以下错误:
\n\nError in gList(list(x = list(links = list(source = c(0, 0), target = c(1, : \nonly \'grobs\' allowed in "gList"\n
Run Code Online (Sandbox Code Playgroud)\n\n我搜索了 \xe2\x80\x9cconverting html widgets to grobs 或plots\xe2\x80\x9d 以便能够将它们排列在网格中,但找不到任何相关信息。我可以采用漫长的手动方式,首先使用htmlwidgets::saveWidget()将 html 小部件保存为网站,然后使用webshot::webshot()将其转换为 pdf,并使用矢量图形编辑器手动排列图形(例如墨景)。但尽管需要手动操作,所有转换步骤都可能会导致质量下降。
\n\n也许我可以以某种方式用表格或列排列 LaTeX R-Markdown 文档中的图形,并指定纸张尺寸以适合我的绘图。但不知怎的,这感觉不像是一个理想的解决方案,因为我可能想将我的图表动态地排列在多个列和行中,添加标题等,这将使 LaTeX/knitr 中的排列变得相当复杂。
\n\n因此,在我开始手动将所有内容编织在一起之前,我想问您是否知道更好的方法来排列一些 html 小部件图并将它们导出到 R 中的 pdf 中?
\n\n最小的例子
\n\n这是一个重现我的问题的小例子。让\xe2\x80\x99s 说我的目标是一个图表,通过将两个不同过程的能量流相互比较(带有networkD3的桑基图),将它们排列在网格中,如下所示:\n示例性排列桑基图
\n\n这将是我的代码:
\n\nlibrary(networkD3)\nlibrary(grid)\nlibrary(gridExtra)\n\n## Create simplified Data\ndfSankey <- list()\ndfSankey$nodes <- data.frame(Name …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个简单的forceNetwork
,但该图不会呈现。我不断收到以下警告:
Warning message: It looks like Source/Target is not zero-indexed. This is required in JavaScript and so your plot may not render.
我该如何解决?请注意,这simpleNetwork
很好用,所以问题似乎出在我如何指定我的数据上。
library(igraph)
library(networkD3)
set.seed(42)
temp<-data.frame(source=c(1,2,3,4),target=c(2,3,4,4))#csv[1:500,]
links<-data.frame(source=temp$source,target=temp$target)
g<-graph.data.frame(cbind(temp$source,temp$target), directed=T)
nodes<-data.frame(name=1:length(V(g)),group=1)
forceNetwork(Links=links,Nodes = nodes,
Source = 'source', Target = 'target',
NodeID = 'name', Group = 'group')
simpleNetwork(temp)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用networkD3和shiny来可视化一些数据.我希望在单击图表中的节点时执行操作.我正在使用对齐网络,如下面的代码所示.
forceNetwork可以选择在单击节点时进行"clickaction"响应.但是,我无法为diagonalNetwork找到类似的选项,还有另一种方法可以实现吗?
谢谢你的帮助!
#### Load necessary packages and data ####
library(shiny)
library(networkD3)
data(MisLinks)
data(MisNodes)
hc <- hclust(dist(USArrests), "ave")
URL <- paste0(
"https://cdn.rawgit.com/christophergandrud/networkD3/",
"master/JSONdata//flare.json")
## Convert to list format
Flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE)
#### Server ####
server <- function(input, output) {
output$simple <- renderDiagonalNetwork({
diagonalNetwork(List = Flare, fontSize = 10, opacity = 0.9)
})
output$force <- renderForceNetwork({
forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source",
Target = "target", Value = "value", NodeID = "name",
Group = "group", opacity …
Run Code Online (Sandbox Code Playgroud) 目前,我正在尝试networkD3
按照Chris Grandrud(https://christophergandrud.github.io/networkD3/)的说明创建一个包含交互式的Sankey .
我不明白的是表格式,因为他只使用两列来可视化更多的过渡.更具体地说,我有一个包含四列代表4年的数据集.这些列中有不同的酒店名称,而每行代表一个客户,这四年内被"跟踪".
URL <- paste0(
"https://cdn.rawgit.com/christophergandrud/networkD3/",
"master/JSONdata/energy.json")
Energy <- jsonlite::fromJSON(URL)
sankeyNetwork(Links = Energy$links, Nodes = Energy$nodes, Source = "source",
Target = "target", Value = "value", NodeID = "name",
units = "TWh", fontSize = 12, nodeWidth = 30)
Run Code Online (Sandbox Code Playgroud)
为了向您概述我的数据,请点击此处截图:
我会给你更多"编码"信息,但由于我对RI这个话题很新,希望你能在这个问题上跟随我的思路.如果没有,请不要犹豫不决.
谢谢 :)
我想重点关注上面的流程,将蓝色的"热量发电"块连接到粉红色的"电网"块.你会注意到流量是526 TWh,这是#62行Energy$links
.
Energy$links
source target value
...
62 26 15 525.531
...
Run Code Online (Sandbox Code Playgroud)
现在让我们关注引用节点的source
和target
值Energy$nodes
.
Energy$nodes
name
...
15 Heating and cooling - homes
16 Electricity grid
...
26 Gas reserves
27 Thermal generation
...
Run Code Online (Sandbox Code Playgroud)
source
当它实际引用节点数据的行"27"时,该值为"26".当实际引用节点数据的行"16"时,目标值为"15".为什么链接数据中的源和目标值实际上是指节点数据中的行 x-1而不是x?除了在构建这些Sankey图时在我头脑中执行x - 1计算时,还有什么方法吗?
这是完整的Energy
数据:
> Energy
$`nodes`
name
1 Agricultural 'waste'
2 Bio-conversion
3 Liquid
4 Losses
5 Solid
6 Gas
7 Biofuel imports
8 Biomass imports
9 …
Run Code Online (Sandbox Code Playgroud) 假设通过 R 库networkD3生成网络图。进一步假设您可以将该网络图保存为外部独立 HTML 文件(请参阅输出部分),或者通过 R 库htmlwidgets呈现它。
您是否有任何方法可以将生成的网络导出为矢量图形(pdf 或 svg),无论是在 R 内部还是外部?
注意:我知道 D3.js 库的主要目的不是生成静态数据可视化,但肯定有一种方法可以使用/转换 D3 网络图进行印刷出版。
编辑 1:按照CJ Yetman 的建议,我通过 Firefox Developer Edition 检查了 HTML 文件的 DOM 属性。使用此方法,可以具体查看 SVG 属性(请参阅此示例),但它们大多是空的。但是,如何如 CJ Yetman 所示“从 DOM 中提取 SVG”?
我想根据它们的中心性在"大"图形(少于500个节点)上着色顶点,并允许用户删除点击事件上的边或顶点.删除顶点或边时,将在图上重新计算新的中心度分数,并再次渲染边和顶点的颜色.
我一直在关注visNetwork和networkD3 R软件包.这篇2015年的博客文章提到visNetwork比networkD3更具特色,但我读过几个提出networkD3如何改变和扩展其功能的SO问题.
在这两个包中的哪一个可以更简单地满足我的要求?
我有这个代码:
library(networkD3)
# Load data
data(MisLinks)
data(MisNodes)
new.nodes <- MisNodes
new.nodes$var1 <- runif(nrow(MisNodes),1,2)
new.nodes$var2 <- runif(nrow(MisNodes),1,2)
# Some script to show the node index in the new.nodes data frame
script <- 'alert("row: " + (d.index + 1));'
# Plot
forceNetwork(Links = MisLinks, Nodes = new.nodes,
Source = "source", Target = "target",
Value = "value", NodeID = "name",
Group = "group", opacity = 0.8,
clickAction = script)
Run Code Online (Sandbox Code Playgroud)
我想通了通过询问来获取节点数据帧的行号d.index + 1
。但是我想显示一个包含所有节点信息的表,如下所示(也许格式更好):
name group size var1 var2
1 Myriel 1 15 …
Run Code Online (Sandbox Code Playgroud) networkd3 ×10
r ×10
htmlwidgets ×7
javascript ×3
d3.js ×2
shiny ×2
gridextra ×1
igraph ×1
networking ×1
plot ×1
svg ×1
visnetwork ×1