【问题标题】:Need help making a line graph from an array and I would like custom tick labels需要帮助从数组制作折线图,我想要自定义刻度标签
【发布时间】:2016-03-15 04:03:56
【问题描述】:

我计划从用户那里获得投票,并在折线图中显示过去三个月的结果。在接下来的几个月里,他们会点击“好”或“坏”的按钮。这是一些来自服务器的数据,我将尝试使其看起来像。

    var results = {
        "month1" : {"good" : 400,"bad" : 30} ,
        "month2" : {"good" : 200, "bad" : 100},
        "month3" : {"good" : 100, "bad" : 200}

    };

我想我会得到一个类似 [370, 100, -100] 的数组,从坏中减去好。我想这些将是图表上的点,该线将通过。所以在“1 个月”(在 x 轴上),这条线将通过 370,在“2 个月”,这条线将通过 100,在“3 个月”,这条线将通过 -100。

  • 我猜 y 轴应该从 -100 缩放到 370
  • x 轴上应该有三个刻度tickLabels = ["1 mo", "2 mo", "3 mo"]

这是我到目前为止所拥有的,我知道这不是很多,因为我很困惑。

var results = {
        "month1" : {"good" : 400,"bad" : 30} ,
        "month2" : {"good" : 200, "bad" : 100},
        "month3" : {"good" : 100, "bad" : 200}

    };

    var arr = []

    for(var key in results){
        var obj = results[key];
        arr.push(obj.good - obj.bad)
    }
    console.log(arr)

    var margin = {top : 30, right : 20, bottom : 30, left: 50},
            width = 600 - margin.left - margin.right,
            height = 270 - margin.top - margin.bottom;

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

    var tickLabels = ["1 mo", "2 mo", "3 mo"]

    var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(function(d, i) { return tickLabels[i]})

    var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5)

我正在学习一些教程,下一部分是这样的:

var valueline = d3.svg.line()
        .x(function(d) {return x(d.date); })
        .y(function(d) {return y(d.close); });

我显然没有dateclose。我只是不知道如何将行生成器应用于我的数据。那么你能帮我用正确的刻度标签完成图表吗?1 mo 等?这将非常有帮助。

编辑 ::: 我会告诉你我现在拥有什么

看来我需要正确缩放 x 值以匹配轴

		var results = {
	        "month1" : {"good" : 400,"bad" : 30} ,
	        "month2" : {"good" : 200, "bad" : 100},
	        "month3" : {"good" : 100, "bad" : 200}

	    };

		var arr = []

		for(var key in results){
			var obj = results[key];
			arr.push(obj.good - obj.bad)
		}
		console.log(arr)

		var margin = {top : 30, right : 20, bottom : 30, left: 50},
				width = 600 - margin.left - margin.right,
				height = 270 - margin.top - margin.bottom;

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

		var tickLabels = ["1 mo", "2 mo", "3 mo"]

		var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(function(d, i) { return tickLabels[i]})

		var yAxis = d3.svg.axis().scale(y).orient("left").ticks(5)

		var valueline = d3.svg.line()
			.x(function(d, i) {return x(i)})
			.y(function(d) {return y(d)})

		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 + ")")

			y.domain([d3.min(arr, function(d) {return d} ), d3.max(arr, function(d) {return d} )])

			svg.append("g").attr("class", "y axis").call(yAxis)

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

		svg.append("path").attr("d", valueline(arr)).style({"fill" : "none", "stroke" : "blue"})
<script src="http://d3js.org/d3.v3.js"></script>

【问题讨论】:

    标签: javascript d3.js graph linechart


    【解决方案1】:

    您的 x 轴显示月份,因此您可以参考 Array arr 的索引。您的 y 轴显示值(好坏),因此它成为该索引处的值。因此,如果 Array arr 是您的数据集,您的价值线应该是:

    var valueline = d3.svg.line()
        .x(function(d,i) {return x(i); })
        .y(function(d) {return y(d); });
    

    在您的代码中添加了这个以及关于域/范围/轴上刻度的更多更改:DEMO

    【讨论】:

    • 您好,非常感谢您的热心回复。现在我希望你帮我调整 x 值。现在看起来线上的第三个点正在脱离 svg 并且“1 mo 2 mo 3 mo”刻度在右侧聚集在一起。我觉得我应该使用x.domain(,但我不知道在这种情况下如何使用它。我更新了问题以显示我在做什么。
    • 我做了x.domain([0, 2]),它使线条看起来与数据正确匹配,但我仍然没有让月份标签展开
    • 我将工作代码放在上面的问题中。你甚至可以点击“运行代码 sn-p”,看看我有什么。
    • 立即查看答案..对您的代码进行了一些更改...域和范围存在问题,以及您如何使用刻度
    • 再次感谢您的回复。在我接受你的回答之前的最后一件事。刻度标签没有散布在图形的整个宽度上。 3mo 应位于右侧 x 轴的末端。图表上的所有标签和对应点应在整个宽度上展开。解决此问题后,我将接受您的回答。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2020-04-17
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多