D3 color hex из json

#javascript #json #d3.js

#javascript #json #d3.js

Вопрос:

Я пытаюсь заполнить свой узел 3D.js hexdecimal цветом из json . Итак, вот пример json файла.

 {"nodes":[{"name":"GCF_000008865.1",
"choose":"1",
"organism_name":"Escherichia coli O157:H7 str. Sakai",
"classification":"cellular organisms; Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacterales; Enterobacteriaceae; Escherichia; Escherichia coli; Escherichia coli O157:H7;",
"lineage":"bacteria>proteobacteria>gammaproteobacteria",
"genera":"Escherichia",
"colorsamp":"#E7298A",
"id":"GCF_000008865.1"},
{"name":"GCF_000006945.2",
"choose":"1",
"organism_name":"Salmonella enterica subsp. enterica serovar Typhimurium str. LT2","classification":"cellular organisms; Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacterales; Enterobacteriaceae; Salmonella; Salmonella enterica; Salmonella enterica subsp. enterica; Salmonella enterica subsp. enterica serovar Typhimurium;",
"lineage":"bacteria>proteobacteria>gammaproteobacteria",
"genera":"Salmonella",
"colorsamp":"#CCEBC5",
"id":"GCF_000006945.2"},
  

colorsamp Поле имеет шестнадцатеричный цветовой код, поэтому я пытаюсь заполнить его таким образом:

 // draw circles for each node
    var node = svg.append("g")
        .attr("class","nodes")
        .selectAll("circle")
        .data(graph.nodes)
        // circle
        .enter().append("circle")
        // radius of the circle
        .attr("r", (d) => {
            if (d.choose == 0 ) {return 5;}
            if (d.choose == 1) {return 8;}
        })
        .attr("fill", function(d) { d.colorsamp; })
              .call(d3.drag()
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended));
        // add text of mouse over, show name and value (% or raw?)
        node.append("title")
            .text(function(d) { return (d.name  "n"   d.lineage   " ("   d.genera  ")"); });
  

Все швы работают нормально, если fill только функция, которая не заполняет узлы цветами.

Obs: я использую D3.js v4 , потому v5 что они не работают с моим кодом.

Заранее спасибо

Ответ №1:

Вы не возвращаете значение colorsamp в функции заполнения.

 .attr("fill", function(d) { d.colorsamp; })
  

Должно быть

 .attr("fill", function(d) { return d.colorsamp; })
  

Или

 .style("fill", function(d) { return d.colorsamp; })
  

Если вы не хотите конфликтовать с CSS.

 const pinkHex = '#E7298A';

const colors = ['#E7298A', 'orange', 'green'];

d3.select('body').append('svg')
  .selectAll('circle')
  .data(colors)
  .enter()
  .append('circle')
  .attr('cx', (d, i) => (i * 50)   25)
  .attr('cy', (d, i) => (i * 30)   25)
  .attr('r', 5)
  .attr('fill', (d) => d)  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>  

Комментарии:

1. Это все еще не работает. Есть некоторая возможность быть hex цветовым кодом.

2. @AurelianoGuedes Я добавил фрагмент. Первый цвет — это один из шестнадцатеричных символов ваших данных. Может быть, у вас есть какой-нибудь css, который вызывает проблему? Вы могли бы изменить .attr('fill', ... на .style('fill'...

3. @AurelianoGuedes Если бы это ответило на ваш вопрос, если бы вы могли отметить как ответ, это было бы здорово!

4. извините, я не закончил отладку. Я тестировал. У меня нет css, который испортил макет. Но было решено. Спасибо