【问题标题】:Issue in fetching data from nested json to construct bar graph in d3从嵌套 json 获取数据以在 d3 中构建条形图的问题
【发布时间】:2016-05-21 18:11:23
【问题描述】:

这里是json数据.. [ { "月":"2016-01",
“顶级服务”:[ { “域”:“EESEL-PROD-XCRM”, “服务”:“订阅者 1_0”, "操作":"getSubscriberProfile", “total_trans”:333646 }, { “域”:“EESEL-PROD-XCRM”, “服务”:“ProductQuery-3_0”, "操作":" listSubscriberProducts3", “total_trans”:242797 }, { “域”:“ELYSEES-PROD”, "服务":"GetCachedNetworkSettings-2_0", “操作”:“脑电图”, “total_trans”:242123 }, ] } ]

【问题讨论】:

  • 到目前为止您尝试了什么...您想在 x 轴和 y 轴上显示什么。条形图是什么样子的??
  • 我尝试通过 ajax 调用获取 json 数据并使用简单的 json 数据(键值)构建条形图。我可以获取嵌套的 json 数据,但无法使用具有 x 的数据绘制条形图-axis 作为操作名称,y 轴作为总交易..
  • 无法为此 json 数据绘制条形图..请帮助 [ { "month":"2016-01", "children": [ { "name": "Al Montoya", "保存”:15.5},{“名称”:“亚历克斯斯塔洛克”,“保存”:14.7},{“名称”:“安德斯林德贝克”,“保存”:12.4},{“名称”:“Anton Khudobin”, “保存”:21.4 } ] } ]

标签: d3.js


【解决方案1】:

var data=[ { "month":"2016-01", "children": [ { "name": "Al Montoya", "saves": 15.5 }, { "name": "Alex Stalock", "saves": 14.7 }, { "name": "Anders Lindback", "saves": 12.4 }, { "name": "Anton Khudobin", "saves": 21.4 } ] } ] ;
data=data[0].children;

var margin = {top: 20, right: 20, bottom: 30, left: 40},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

var x = d3.scale.ordinal()
    .rangeRoundBands([0, width], .1);

var y = d3.scale.linear()
    .range([height, 0]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left");
    //.ticks(10, "%");

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
  .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

//d3.tsv("data.tsv", type, function(error, data) {
  //if (error) throw error;


  x.domain(data.map(function(d) { return d.name; }));
  y.domain([0, d3.max(data, function(d) { return d.saves; })]);

  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + height + ")")
      .call(xAxis);

  svg.append("g")
      .attr("class", "y axis")
      .call(yAxis)
    .append("text")
      .attr("transform", "rotate(-90)")
      .attr("y", 6)
      .attr("dy", ".71em")
      .style("text-anchor", "end")
      .text("Frequency");

  svg.selectAll(".bar")
      .data(data)
    .enter().append("rect")
      .attr("class", "bar")
      .attr("x", function(d) { return x(d.name); })
      .attr("width", x.rangeBand())
      .attr("y", function(d) { return y(d.saves); })
      .attr("height", function(d) { return height - y(d.saves); });
//});

function type(d) {
  d.saves = +d.saves;
  return d;
}
.bar {
  fill: steelblue;
}

.bar:hover {
  fill: brown;
}

.axis {
  font: 10px sans-serif;
}

.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}

.x.axis path {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

首先我们需要将数据转换成需要的格式,即对象数组,通过

var data=[ { "month":"2016-01", "children": [ { "name": "Al Montoya", "saves": 15.5 }, { "name": "Alex Stalock", "saves": 14.7 }, { "name": "Anders Lindback", "saves": 12.4 }, { "name": "Anton Khudobin", "saves": 21.4 } ] } ] ;
data=data[0].children;

所以现在data 有一个对象数组。希望你能理解剩下的。

【讨论】:

  • 非常感谢..我可以在 y 轴上绘制以十万为单位的数据,但是如何在 y 轴上用数字计算出来.. ex:var data=[ { "month": “2016-01”,“儿童”:[{“名称”:“Al Montoya”,“保存”:333646 },{“名称”:“Alex Stalock”,“保存”:242797 },{“名称”: “安德斯·林德贝克”,“保存”:242123 },{“名称”:“安东·库多宾”,“保存”:240055 } ] } ] ;
  • 我们可以将其更改为任何格式,例如数千或十万等。您希望以哪种格式显示它。有一个函数 type() 可以将值除以 10 或 100 或 1000 或 10000。然后 Y 轴值将相应更改。不知道。
  • 非常感谢..我想以十万为单位显示,但有点困惑在哪里使用函数 type()。
  • data=data[0].children; 行后data.forEach(function(d){type(d);});type(d) 中除以1000 d.saves=+d.saves/1000。 k
  • 当我将鼠标移到图表上时,我得到了他们在保存字段中的数据,但想转换成百分比..请帮助我..示例 242797 转换为 24.2797%..
【解决方案2】:
import java.util.*;

public class HelloWorld{

     public static void main(String []args){
         SynonymTable synTable = new SynonymTable();
         synTable.registerSynonym("tv","dhoordharshan, television");
         synTable.registerSynonym("radio","akashavani");
         synTable.registerSynonym("house ","home");
         System.out.println("tv-"+synTable.getSynonyms("tv"));

     }
}

class SynonymTable {

private Map<String, Set<String>> synonymTable = new HashMap<>();

public Set<String> getSynonyms(String word) {
    return synonymTable.get(word);
}

public void registerSynonym(String word, String... synonymsOfWord) {
    for (String syn : synonymsOfWord) {
        putSynonymTable(word, syn); // synonym(word) = syn
        putSynonymTable(syn, word); // synonym(syn) = word
    }
}

private void putSynonymTable(String word, String synonymOfWord) {
    Set syns = synonymTable.get(word);
    if (syns == null) {
        syns = new TreeSet<String>();
        synonymTable.put(word, syns);
    }
    syns.add(synonymOfWord);
}

}

试试这个,它会给你所有的同义词。如果这不是您正在寻找的,那么请询问 ....

【讨论】:

  • 谢谢。:) 我会检查n让你知道:)
  • 嗨,你说的更简单的代码是什么意思。我没听懂你。
  • 问我。没问题。你就发帖吧。每当我有空时,我都会尝试解决并将其交给您。好的。
  • 我有一个问题...如何检查给定的单词是否是他们的 in word net。
  • 我没听懂你的问题,你能解释一下吗?
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多