Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript R在sankeyNetwork中指定颜色_Javascript_R_D3.js - Fatal编程技术网

Javascript R在sankeyNetwork中指定颜色

Javascript R在sankeyNetwork中指定颜色,javascript,r,d3.js,Javascript,R,D3.js,我正在尝试使用R中的networkD3包,特别是sankeyNetwork函数创建一个Sankey图。我试图复制劳伦斯·利弗莫尔国家实验室的桑基图: 到目前为止,我已经能够使用以下代码接近: 数据: energy也许这有帮助。我将尝试在线评论。正如chinsoon12所说,节点似乎不太匹配。运行他的代码,我们看到了 > setdiff(energy$links$energy_type, energy$nodes$name) [1] "Natural" 这告诉我们,链接的数据中使用了“N

我正在尝试使用R中的
networkD3
包,特别是
sankeyNetwork
函数创建一个Sankey图。我试图复制劳伦斯·利弗莫尔国家实验室的桑基图:

到目前为止,我已经能够使用以下代码接近:

数据:


energy也许这有帮助。我将尝试在线评论。正如chinsoon12所说,节点似乎不太匹配。运行他的代码,我们看到了

> setdiff(energy$links$energy_type, energy$nodes$name)
[1] "Natural"
这告诉我们,链接的数据中使用了
“Natural”
,而节点中使用了
“Natural Gas”
。我经常发现使用
data.frame
帮助我识别色阶中的问题很有帮助

energy <- structure(list(nodes = structure(list(name = structure(c(15L, 
     11L, 8L, 17L, 7L, 10L, 2L, 1L, 12L, 4L, 14L, 3L, 9L, 16L, 13L, 
     6L, 5L), .Label = c("Biomass", "Coal", "Commericial", "Electricity", 
    "Energy Services", "Exports", "Geothermal", "Hydro", "Industrial", 
    "Natural Gas", "Nuclear", "Petroleum", "Rejected Energy", "Residential", 
    "Solar", "Transportation", "Wind"), class = "factor")), .Names = "name",                   class = "data.frame", row.names = c(NA, 
    -17L)), links = structure(list(source = c(0L, 0L, 1L, 2L, 2L, 
     3L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
     8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 11L, 11L, 
     12L, 12L, 13L, 13L), target = c(9L, 10L, 9L, 9L, 12L, 9L, 9L, 
     10L, 11L, 9L, 10L, 11L, 12L, 13L, 9L, 12L, 9L, 10L, 11L, 12L, 
     13L, 9L, 10L, 11L, 12L, 13L, 10L, 11L, 12L, 13L, 14L, 15L, 14L, 
     16L, 14L, 16L, 14L, 16L, 14L, 16L), value = c(0.25, 0.28, 8.34, 
     2.38, 0.01, 1.81, 0.16, 0.04, 0.02, 9.99, 4.75, 3.3, 9.36, 0.92, 
     14.3, 1.41, 0.52, 0.45, 0.13, 2.28, 1.35, 0.28, 0.98, 0.56, 8.2, 
     25.4, 4.78, 4.63, 3.27, 0.03, 25.4, 0.08, 3.95, 7.33, 3.05, 5.66, 
     4.91, 19.6, 21.9, 5.81), energy_type = structure(c(12L, 12L, 
     9L, 7L, 7L, 13L, 6L, 6L, 6L, 8L, 8L, 8L, 8L, 8L, 2L, 2L, 1L, 
     1L, 1L, 1L, 1L, 10L, 10L, 10L, 10L, 10L, 3L, 3L, 3L, 3L, 11L, 
     5L, 11L, 4L, 11L, 4L, 11L, 4L, 11L, 4L), .Label = c("Biomass", 
    "Coal", "Electricity", "Energy Services", "Exports", "Geothermal", 
    "Hydro", "Natural", "Nuclear", "Petroleum", "Rejected Energy", 
    "Solar", "Wind"), class = "factor")), .Names = c("source", "target", 
    "value", "energy_type"), class = "data.frame", row.names = c(NA, 
    -40L))), .Names = c("nodes", "links")) 

library(networkD3)

sankeyNetwork(Links = energy$links, Nodes = energy$nodes, Source = "source",
         Target = "target", Value = "value", NodeID = "name",
         units = "Quads", LinkGroup = 'energy_type', colourScale = JS(

           'd3.scaleOrdinal()  
    .domain(["Solar","Nuclear","Hydro","Wind","Geothermal","Natural Gas","Coal","Biomass","Petroleum","Electricity","Residential","Commericial","Industrial","Transportation","Rejected Energy","Exports","Energy Services"])
    .range(["#FFFF00","#FF0000","#0000FF","#800080","#A52A2A","#00FFFF","#000000","#00FF00","#008000","#FFA500","#FAAFBE","#FAAFBE","#FAAFBE","#FAAFBE","#C0C0C0","#FFA500","#808080"])'

         ), 
fontSize = 12, nodeWidth = 75, iterations = 100)

# putting in a data.frame might help see problems
color_scale <- data.frame(
  range = c("#FFFF00","#FF0000","#0000FF","#800080","#A52A2A","#00FFFF","#000000","#00FF00","#008000","#FFA500","#FAAFBE","#FAAFBE","#FAAFBE","#FAAFBE","#C0C0C0","#FFA500","#808080"),
  domain = c("Solar","Nuclear","Hydro","Wind","Geothermal","Natural Gas","Coal","Biomass","Petroleum","Electricity","Residential","Commericial","Industrial","Transportation","Rejected Energy","Exports","Energy Services"),
  nodes = energy$nodes,
  stringsAsFactors = FALSE
)

# once corrected color_scale can be used like this
sankeyNetwork(
  Links = energy$links, Nodes = energy$nodes, Source = "source",
  Target = "target", Value = "value", NodeID = "name",
  units = "Quads", LinkGroup = 'energy_type', colourScale = JS(
sprintf(
'd3.scaleOrdinal()  
  .domain(%s)
  .range(%s)
',
jsonlite::toJSON(color_scale$domain),
jsonlite::toJSON(color_scale$range)
   )
  ), 
  fontSize = 12, nodeWidth = 75, iterations = 100
)

# if we change Natural Gas to Natural then
#   the cyan appears as desired
color_scale[6,2] <- "Natural"

energy我对节点名称中的空格也有问题。这里有一个例子

library(networkD3)
Class<-c("Fristående","Nästan_öppet", "Halvöppet", "Slutet")
# Class<-c("Fristående","Nästan öppet", "Halvöppet", "Slutet") #Broken
nClass<-length(Class)
UtMat<-matrix(c(6, 9, 8, 0, 
            0, 9, 18, 3,
            0, 1, 18, 6,
            0, 0, 3, 10), nClass,nClass, byrow = TRUE, dimnames = list(Class, Class) )

ClassF <- structure(list(nodes = data.frame(name=as.factor(c(Class,Class)), label=c(Class,Class)),
                     links = data.frame(source = rep(c(0:3), each=4), # from
                                        target = rep(c(4:7), 4), # to
                                        value = as.vector(t(UtMat)),
                                        group = as.factor(rep(Class, each=4)))
                      )
                )
sankeyNetwork(Links = ClassF$links, Nodes = ClassF$nodes, 
          Source = "source", Target = "target", Value = "value", NodeID = "name",
          units = "", LinkGroup = 'group', 
          colourScale = JS(
            'd3.scaleOrdinal()
            .domain(["Fristående","Nästan_öppet","Halvöppet","Slutet"])
            .range(["#EDF8E9","#BAE4B3","#74C476","#238B45"])' 
          ),
          fontFamily = "Arial", fontSize = 12, nodeWidth = 75)
库(networkD3)

类当您希望手动指定颜色时,可以通过在
d3.scaleOrdinal()
中不指定
.domain
来避免与节点名称中的空格相关的问题。您只需在
.range
中以与节点相同的顺序引入颜色

例如,假设这是节点的顺序:Fristående、Nästanåppet、Halvöppet、Slutet,则只需指定以下内容:

'd3.scaleOrdinal()
            .range(["#EDF8E9","#BAE4B3","#74C476","#238B45"])'

您的
energy$节点与
energy$链接$energy\u类型中的节点不匹配。尝试运行此
setdiff(energy$links$energy\u type,energy$nodes$name)
谢谢。你确实发现我的名字有问题(doh!),但即使在我修复它的时候,我仍然会遇到同样的问题。我在天然气和天然气之间加了一个下划线(天然气->天然气),这就解决了这个问题。当我对最右边的两个节点这样做时,它也为它们添加了正确的颜色(灰色和深灰色)。。。D3似乎不喜欢这两个词的名字?我还是不确定。如果可能的话,我不希望有这种解决方法。带空格的名称应该不会有问题。我将深入研究代码,看看发生了什么。下面是令人不快的行和行。我所看到的正则表达式实际上没有任何用途,因此我将其归类为bug。我们正在计划对sankey进行一些重大改进,并将确保这一点在那里得到解决。感谢@timelyportfolio如果有开放的建议框,我想在sankey中看到一些建议!我正在尝试重新创建这个答案,但当我尝试这样做时,会得到一个空白的HTML文档,自提供这个答案以来,sankeyNetwork是否发生了更改@TimelyPortfolio这是一个答案还是一个问题?答案,就像现在一样,你不能在类的名称中使用空格。移除这些空间是解决问题的一项工作。
'd3.scaleOrdinal()
            .range(["#EDF8E9","#BAE4B3","#74C476","#238B45"])'