【问题标题】:javascript d3 line graph with ordinal x axis带有序数x轴的javascript d3折线图
【发布时间】:2017-06-16 04:49:14
【问题描述】:

我是 d3 的新手,我正在尝试使用序数 x 轴绘制地图,例如对于这个数据

{cat: 10, dog: 3, pig: 7, bird: 7}

我想在 x 轴上显示猫、狗、猪、鸟,在 y 轴上显示相应的数字。

我正在尝试使用 d3.line() 函数,但有点困惑为 x 参数发送什么。

【问题讨论】:

    标签: javascript d3.js graph


    【解决方案1】:

    把你的数据结构改成这样:

    var data = [{
        name: "cat",
        value: 10
    }, {
        name: "dog",
        value: 3
    }, {
        name: "pig",
        value: 7
    }, {
        name: "bird",
        value: 7
    }];
    

    这样,您可以定义线生成器(查看演示以了解这些比例是什么):

    var line = d3.line()
        .x(function(d) {
            return xScale(d.name)
        })
        .y(function(d) {
            return yScale(d.value)
        });
    

    因此,x 参数是name 变量的定性值,而yvalue 变量的定量值。

    这里的重点是:如果您在 x 轴上使用定性变量,请设置一个定性尺度来处理该定性变量,并将这种尺度的返回值传递给线生成器。

    这里是演示:

    var data = [{
        name: "cat",
        value: 10
    }, {
        name: "dog",
        value: 3
    }, {
        name: "pig",
        value: 7
    }, {
        name: "bird",
        value: 7
    }];
    
    var width = 500,
        height = 200;
    
    var svg = d3.selectAll("body")
        .append("svg")
        .attr("width", width)
        .attr("height", height);
    
    var xScale = d3.scalePoint()
        .domain(data.map(function(d) {
            return d.name
        }))
        .range([50, width - 50])
        .padding(0.5);
    
    var yScale = d3.scaleLinear()
        .domain([0, d3.max(data, function(d) {
            return d.value
        }) * 1.1])
        .range([height - 50, 10]);
    
    var line = d3.line()
    	.x(function(d){ return xScale(d.name)})
    	.y(function(d){ return yScale(d.value)});
    	
    svg.append("path")
    	.attr("d", line(data))
    	.attr("stroke", "teal")
    	.attr("stroke-width", "2")
    	.attr("fill", "none");
    
    var xAxis = d3.axisBottom(xScale);
    var yAxis = d3.axisLeft(yScale);
    
    svg.append("g").attr("transform", "translate(0,150)")
        .attr("class", "xAxis")
        .call(xAxis);
    
    svg.append("g")
        .attr("transform", "translate(50,0)")
        .attr("class", "yAxis")
        .call(yAxis);
    <script src="https://d3js.org/d3.v4.min.js"></script>

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2012-12-18
      • 1970-01-01
      • 2017-07-31
      • 2013-03-12
      • 1970-01-01
      • 2019-05-07
      • 2014-10-18
      • 1970-01-01
      相关资源
      最近更新 更多