iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 16
0
Data Technology

讓你資料美美的(d3.js+vue.js)系列 第 16

D3-長條圖

長條圖

這次來對簡單圖表做一些改變

  • 使用< g >,svg中的group標籤
  • 轉個方向,上次是橫的這次是直的
  • 把數字放到chartbar中

首先為了讓rect跟text的對位更加容易,所以把兩者放在相同的group中,要生成正確的數量在此就將資料讀入

var bar = chart.selectAll("g")
	.data(dataset)
	.enter().append("g")

在svg中,顯示順序相當於圖層的先後順序,後產生的會在上方
https://ithelp.ithome.com.tw/upload/images/20180105/20105602tZxrHlRqXK.png

所以如果要讓text不被rect擋住,就必須先產生rect,後產生text,才會得到預期的效果,也就是說html要看起來像這樣。

<g>
    <rect></rect>
    <text></text>
</g>

由g包住rect跟text,而且text在rect之後


  • 所以在js的部分,先放rect在放text
  • 要將橫的改成直的基本上是將x,y互換在做一些調整即可
bar.append("rect")
    .attr("y",function(d,i){return 500-(d*3);})
    .attr("x",function(d,i){
         return i * rheight;
    })
    .attr("height",function(d){
         return (d*3);
    })
    .attr("width",rheight-3)
    .attr("fill","#5F4B8B");


bar.append('text')
	.attr('y',function(d){return 500-(d*3)+21;})
	.attr("x",function(d,i){
         return i * rheight+22;
    })
	.style('fill', '#FFF')
	.style('font-size', '18px')
	.style('font-weight', 'bold')
	.style("text-anchor", 'middle')
	.text(function(d){
	return d;}
		 );

結果如圖
https://ithelp.ithome.com.tw/upload/images/20180105/20105602ma42s280Ul.png

本次程式碼:https://codepen.io/FanWay/pen/KZvLqB


上一篇
D3的簡易圖表
下一篇
D3與SVG
系列文
讓你資料美美的(d3.js+vue.js)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
火爆浪子
iT邦研究生 1 級 ‧ 2018-08-30 21:50:24

若是用 php 當後端,如何使用 d3?

方威 iT邦新手 5 級 ‧ 2018-08-31 12:51:49 檢舉

建議可以將php包裝成api輸出json
然後搭配ajax 或是axios來抓取資料
最後把資料放在d3上使用就可以了
這個範例可以參考看看
https://fwcloud916.github.io/d3finaltask/

如果有什麼問題可以再留言
晚點再回答詳細一些

火爆浪子 iT邦研究生 1 級 ‧ 2018-08-31 13:34:40 檢舉

嗯我來看看,
因為我不太懂怎麼把 php 的資料給前端的 js

方威 iT邦新手 5 級 ‧ 2018-08-31 23:54:06 檢舉

假設今天有一個後端php片段如下
我從資料庫把值取出來存在array中
最後透過json_encode()把array輸出成json格式

//api.php
<?php
    if($action == 'read'){
        $result = $conn->query("SELECT * FROM `feedback` WHERE 1");//取值
        
        $rs = array();
        while($row = $result->fetch_assoc()){
            array_push($rs, $row);
        }//存到array
        exit(json_encode($rs));//將array轉換成json輸出
    }
?>

如果前端要取得值
可以利用ajax來跟後端撈資料可以透過一些函式庫幫忙像axios或jquery 當然也可以用原生js來做處理

//axios
    axios.get("api.php?action=read")
        .then(function(response){
            if(response.data.error){
                errorMessage = response.data.message; 
            } else{
                data = response.data;
        }
    });
    
//jquery
    $.ajax({
        type: 'get',
        url: 'api.php?action=read',
        dataType: "json",
        success:function(r){
            data = response.data;
        },
        error:function(e){
            errorMessage = response.data.message;
        }
    })

最後d3中有一個d3.json()可以把json資料讀進去
然後使用方法就與陣列大同小異
可以參考第29天的作法
還有問題再留言給我也可以

我要留言

立即登入留言