亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么條形會出現“倒數值”?d3.js

為什么條形會出現“倒數值”?d3.js

函數式編程 2022-01-01 20:04:58
我正在嘗試學習如何在 React 中使用 d3.js,但我的代碼有問題。我正在做一個條形圖,但是條形的值是“倒置的”,例如,條形的值為 30%,但在圖表中,條形顯示為 70%(例如,100% - 30% = 70 %)。 我該如何解決?這是我的代碼:codeSandBox。我的另一個問題是:如何更改條形的高度?我想添加一些 margin-top 來顯示 y 軸的所有內容,但是如果我這樣做,條形仍然具有相同的高度并且與 yAxis 值不匹配
查看完整描述

2 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

這里的問題是您正在交換y和height邏輯,它應該是:


.attr("y", d => yScale(d.percent))

.attr("height", d => height - margin.bottom - margin.top - yScale(d.percent)) 

或者,如果您將工作高度設置為...


height = totalHeight - margin.bottom - margin.top

...它可以只是:


.attr("y", d => yScale(d.percent))

.attr("height", d => height - yScale(d.percent)) 

最重要的是(這解決了您的第二個問題),您錯誤地使用了 Bostock 的保證金約定。您應該g根據邊距翻譯該組,然后將所有小節附加到該已翻譯組中,而無需再次翻譯它們。此外,將軸的組附加到該g組。


話雖如此,這是具有這些更改的代碼:

const data = [{

    year: 2012,

    percent: 50

  },

  {

    year: 2013,

    percent: 30

  },

  {

    year: 2014,

    percent: 90

  },

  {

    year: 2015,

    percent: 60

  },

  {

    year: 2016,

    percent: 75

  },

  {

    year: 2017,

    percent: 20

  }

];


const height = 300;

const width = 370;

const margin = {

  top: 20,

  right: 10,

  bottom: 20,

  left: 25

};


const xScale = d3.scaleBand()

  .domain(data.map(d => d.year))

  .padding(0.2)

  .range([0, width - margin.right - margin.left]);


const yScale = d3

  .scaleLinear()

  .domain([0, 100])

  .range([height - margin.bottom - margin.top, 0]);


const svg = d3

  .select("body")

  .append("svg")

  .attr("width", width)

  .attr("height", height)

  .style("margin-left", 10);


const g = svg

  .append("g")

  .attr("transform", `translate(${margin.left}, ${margin.top})`);


g

  .selectAll("rect")

  .data(data)

  .enter()

  .append("rect")

  .attr("x", d => xScale(d.year))

  .attr("y", d => yScale(d.percent))

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

  .attr("height", d => height - margin.bottom - margin.top - yScale(d.percent))

  .attr("fill", "steelblue")



g.append("g")

  .call(d3.axisLeft(yScale));


g.append("g")

  .call(d3.axisBottom(xScale))

  .attr(

    "transform",

    `translate(0, ${height - margin.bottom - margin.top})`

  );

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>


查看完整回答
反對 回復 2022-01-01
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

svg

      .selectAll("rect")

      .data(data)

      .enter()

      .append("rect")

      .attr("x", d => xScale(d.year))

      .attr("y", d => height - yScale(100-d.percent))

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

      .attr("height", d => yScale(100-d.percent))

      .attr("fill", "steelblue")

      .attr("transform", `translate(${margin.left}, -${margin.bottom})`);

你需要減去 100 的百分比


工作:https : //codesandbox.io/s/crimson-microservice-8kjqd


查看完整回答
反對 回復 2022-01-01
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號