昨天晚上原本打算花一點時間把以前學的柱狀圖改一下,用CSV文件來替換自定義數據。這一替換可不得了,一夜就搭進去了,還好今早找到了問題的所在,緣由在於個人數據引用出了問題。javascript
如今就來說解一下如何畫一個柱狀圖吧:css
柱狀圖的畫法和折線圖其實很相似,只要掌握了比例尺的用法和座標軸的畫法,咱們只要在此基礎上添加「rect」元素添加矩形就能夠了,但這其中也有一些要點,我會在其中標出,但願對你有用。html
對於d3不一樣版本帶來的代碼不適用的解決辦法:1)、下載對應的v3或者v4版本加到代碼引用裏能夠解決。java
2)、對於我博客的代碼,只要你確保網絡暢通,應該不會出錯數組
<!DOCTYPE html> <html> <head>
<meta charset="utf-8"> <title>文檔的標題</title> </head>
<body> <script src="https://cdn.bootcss.com/d3/3.5.15/d3.js"></script>//網頁引用d3庫
</body> </html>
好了,接下來就是完整代碼:瀏覽器
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>繪製圖形</title> </head> <style> /* 給body添加大小 */ body, html { height: 100%; } { padding: 0; margin: 0; } .axis path, .axis line { fill: none; stroke: black; shape-rendering: crispEdges; } .axis text { font-family: sans-serif; font-size: 11px; } .MyRect { fill: palevioletred; } .MyText { fill: black; text-anchor: middle; font-size: 10px; } </style> <body> <script src="https://cdn.bootcss.com/d3/3.5.15/d3.js"></script> <script> var width = 500; var height = 500; var svg = d3.select("body") .append("svg") .attr("width", width) .attr("height", height); var padding = { left: 30, right: 30, top: 20, bottom: 20 }; ////http://blog.sina.com.cn/s/blog_ad72a03a0102v1nx.html 含解釋 d3.csv("../bardata.csv", function(error, data, i) { if (error) { console.log(error); } console.log(data); var datavalue = [] for (let i = 0; i < data.length; i++) { datavalue.push(data[i].value) } // var xp = d3.scale.ordinal() // // .domain(d3.range(dataset.length)) // // 使用map來輸入data數組中的字符 // .domain(data.map(function(d,i){ // // console.log(d.items) // return d.items // })) // .rangeRoundBands([0,width-padding.left-padding.right]); // var xp = d3.scale.ordinal() // .domain(data.map(function(d){ return d.items;})) // .rangeBands([0,width-padding.left-padding.right]);
//以上定義xp(即xscale)橫座標序數比例尺的方法均可以試一下,會有不一樣的體驗 var xp = d3.scale.ordinal() .domain(data.map(function(d) { return d.items; })) .rangeRoundBands([0, width - padding.left - padding.right], 0.1); var yp = d3.scale.linear() .domain([0, d3.max(datavalue)]) .range([height - padding.top - padding.bottom, 0]) //反過來?爲何呢(以前彷佛講過哦0w0) var xAxis = d3.svg.axis() .scale(xp) .orient("bottom"); var yAxis = d3.svg.axis() .scale(yp) .orient("left"); var rectPadding = 4; var rects = svg.selectAll(".MyRect") .data(data) .enter() .append("rect") .attr("class", "MyRect") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .attr("x", function(d, i) { return xp(d.items); }) .attr("y", function(d) { return yp(d.value); }) .attr("width", xp.rangeBand() - rectPadding) .attr("height", function(d) { return height - padding.top - padding.bottom - yp(d.value); }) .on("mouseover", function(d, i) { d3.select(this) .style("fill", "aliceblue"); }) .on("mouseout", function(d, i) { d3.select(this) .style("fill", "greenyellow"); // 使用style替換attr纔會有交互的效果 });
var texts = svg.selectAll(".MyText") .data(data) //害我出錯的就是這兒了,我以前寫的是.data(datavalue),datavalue又是哪兒來的呢?爲何引用錯誤,會致使tips的位置錯亂呢? .enter() .append("text") .attr("class", "MyText") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .attr("x", function(d) { return xp(d.items);//上面問題的答案都在這兒,d=》data,數據的意思,那data是哪兒來的呢?固然是咱們傳進來的,那爲何data不會出錯,而datavalue會錯呢?
//是因爲xp()是咱們以前定義的序數比例尺,咱們若是想要使用就必須傳入適合的數據(包含x,y),若是隻是傳入datavalue就只有y值,而咱們並無將x傳入。
}) .attr("y", function(d) { return yp(d.value); }) .attr("dx", function() { return (xp.rangeBand() - rectPadding) / 2; }) .attr("dy", function(d) { return 15; }) .text(function(d) { return d.value; }); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")") .call(xAxis); svg.append("g") .attr("class", "axis") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .call(yAxis); }) </script> </body> </html>
老樣子,好貨沉底服務器
———————————————————————————————————————————————————————————————————app
修改:因爲瀏覽器的沙箱機制致使直接複製代碼是無法直接運行的,因此貼出原碼外加數據dom
連接:https://pan.baidu.com/s/13RhuYM9pz0WiFya0IcOrJQ
提取碼:069a
1、最簡單的方法是下載HbuiderX,而後導入文件,打開。(二不用看了)
2、在此若是你沒有安裝任何服務器,直接想用文件啓動網頁的化,你能夠這樣作:
1)、確保你的電腦上安裝了Python(二或者三的版本均可以)
2)、
在文件路徑下打開cmd(上圖最簡,打開文件,輸入cmd,回車ok)
3)、鍵入命令
Python2用這個
4)、啓動服務器
5)、瀏覽器中輸入:
打開文件,結束。