簡體   English   中英

D3 x軸顯示不正確

[英]D3 x-Axis not showing correctly

我正在嘗試使用從JSON實現的數據創建條形圖。 這在我的測試驅動器中正常工作,其中包含來自csv的數據,但是在顯示圖形中的x軸時遇到問題。 當前顯示方式如下:

當前顯示方式

var svg = d3.select("svg"),
margin = {top: 20, right: 20, bottom: 30, left: 40},
width = +svg.attr("width") - margin.left - margin.right,
height = +svg.attr("height") - margin.top - margin.bottom;

var x = d3.scaleOrdinal().range([0, width]);
var y = d3.scaleLinear().rangeRound([height, 0]);


var g = svg.append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

d3.json(urljson, function(error, data) {
    data = data.results;
data.forEach(function(d) {
    d.result = +d.result;
});
console.log(data);

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

g.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + (height) + ")")
    .call(d3.axisBottom(x));
console.log(x.domain());
console.log(y.domain());

g.append("g")
    .attr("class", "axis axis--y")
    .call(d3.axisLeft(y))
    .append("text")
    .attr("transform", "rotate(-90)")
    .attr("y", 6)
    .attr("dy", "0.71em")
    .attr("text-anchor", "end")
    .text("Value");

g.selectAll(".bar")
    .data(data)
    .enter()
    .append("rect")
        .attr("class", "bar")
        .attr("x", function(d) {return x(d.date); })
        .attr("y", function(d) {return y(d.result); })
        .attr("height", function(d) {return height - y(d.result);})
});

我正在使用的JSON如下所示:

{
"count": 5,
"next": null,
"previous": null,
"results": [
    {
        "date": "2017-09-22",
        "result": 35.9
    },
    {
        "date": "2017-09-23",
        "result": 65.12
    },
    {
        "date": "2017-09-24",
        "result": 11.23
    },
    {
        "date": "2017-09-25",
        "result": 77.8
    },
    {
        "date": "2017-09-26",
        "result": 108.98
    }
]
}

由於x序數標度,因此必須設置一個具有相同域元素數量的范圍。 根據API:

如果范圍中的元素少於域中的元素,則比例尺將從范圍開始重新使用值 (強調我的)

這是一個演示,演示了代碼的行為:域中的所有值都將以0width打印:

 var svg = d3.select("svg"); var scale = d3.scaleOrdinal() .domain(["foo", "bar", "baz", "foobar", "foobaz"]) .range([10, 290]) var xAxis = d3.axisBottom(scale); svg.append("g") .attr("transform", "translate(0,50)") .call(xAxis); 
 <script src="https://d3js.org/d3.v4.min.js"></script> <svg></svg> 

解決方案 :一種簡單的替代方法是使用帶刻度(或點刻度,具體取決於您的目標)。 因此,應為:

var x = d3.scaleBand().range([0, width]);

這是使用帶刻度的相同代碼:

 var svg = d3.select("svg"); var scale = d3.scaleBand() .domain(["foo", "bar", "baz", "foobar", "foobaz"]) .range([10, 290]) var xAxis = d3.axisBottom(scale); svg.append("g") .attr("transform", "translate(0,50)") .call(xAxis); 
 <script src="https://d3js.org/d3.v4.min.js"></script> <svg></svg> 

PS:我看到在您的代碼中,矩形沒有寬度。 如果決定使用帶刻度,則可以執行以下操作:

.attr("width", x.bandwidth())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM