chartjs在圖上顯示文字

chartjs是一款非常好用的數(shù)據(jù)可視化工具斋日,對比了echarts牲览、highcharts、c3桑驱、flot竭恬、amchart等各種工具后,現(xiàn)在我的畫圖表工具基本90%都是用chartjs來搞定熬的。
畫面效果、動態(tài)效果都很精致赊级,清爽簡潔押框,基本滿足了一般數(shù)據(jù)展示的需要,現(xiàn)在ppt都懶得做了理逊。
用php結(jié)合chartjs橡伞,效果棒棒盒揉。
上幾張圖,show一下兑徘。

屏幕快照 2018-12-27 下午8.15.37.png
屏幕快照 2018-12-27 下午8.16.00.png
new.png

不過問題也不少刚盈,數(shù)據(jù)不能在圖上顯示,這個很頭疼挂脑,在網(wǎng)上找到的解決方法也只有柱狀圖的藕漱,并沒有圓環(huán)圖、曲線圖崭闲,于是上chartjs的官網(wǎng)上肋联,下載了未壓縮版的chart.js文件,終于找到了解決辦法刁俭,效果如下橄仍。

屏幕快照 2018-12-26 下午8.13.17.png

屏幕快照 2018-12-26 下午8.14.00.png

chartjs就是用canvas ctx畫圖,不嫌麻煩就可以為所欲為了牍戚。
柱狀圖中侮繁,關(guān)鍵在在option中的animation,如下:

options: {
            animation: {
                duration: 1,
                onComplete: function() {
                    var chartInstance = this.chart,
                    ctx = chartInstance.ctx;
                    ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);
                    ctx.textAlign = 'center';
                    ctx.textBaseline = 'bottom';
                    ctx.fillStyle = '#006080';

                    this.data.datasets.forEach(function(dataset, i) {
                        var meta = chartInstance.controller.getDatasetMeta(i);
                        meta.data.forEach(function(arc, index) {
                            var data = dataset.data[index];
                            var ct=Math.round(arc._model.width*0.35);
                            if(ct<12){ct=12;}
                            ctx.font=ct+'px Arial';

                            ctx.fillText(data, arc._model.x, data>=0?arc._model.y :arc._model.y+15);
                        });
                    });
                }
            },

doughnut圓環(huán)圖如孝,我是這么寫的鼎天。


        options: {

            animation: {
                duration: 1,
                onComplete: function() {
                    var chartInstance = this.chart,
                        ctx = chartInstance.ctx;
                    var i, len;
                    var x = 0;
                    var y = 0;
                    var count = 0;

                    ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);
                    ctx.textBaseline = 'bottom';
                    // var total = this.data.total;

                    this.data.datasets.forEach(function(dataset, i) {
                        var meta = chartInstance.controller.getDatasetMeta(i);
                        var arc = meta.data[i];
                        var objLt10=0;//object less than 5%
                        var total =eval(dataset.data.join("+"));

                        meta.data.forEach(function(arc, index) {
                            var data = dataset.data[index];
                            var textshift=0;
                            if(data!=0){

                                var chartCenterX = arc._model.x;
                                var chartCenterY = arc._model.y;
                                var arcCenter = calc(arc._model.startAngle, arc._model.endAngle, arc._model.outerRadius*1.1, arc._model.innerRadius, chartCenterX, chartCenterY);


                                if(arc._model.circumference<0.314){
                                    ctx.textBaseline = 'bottom';

                                    objLt10++;

                                        ctx.font="14px Arial";
                                    ctx.fillStyle=arc._model.backgroundColor;
                                    if(objLt10<=10) {
                                        ctx.textAlign = 'left';
                                        blockx=10;
                                        cx=60;
                                        cy=chartCenterY+arc._model.outerRadius+20-objLt10*25;
                                        text='██ '+Math.round(data*100/total)+'%' ;

                                    }else{
                                        ctx.textAlign = 'right';
                                        cx=arc._model.x*2-60;
                                        blockx=arc._model.x*2-10;
                                        cy=chartCenterY+arc._model.outerRadius+20-(objLt10-10)*25;
                                    }
                                    ctx.fillText(text, blockx,cy);
                                    ctx.fillStyle='#808080';
                                    ctx.fillText(arc._model.label+' '+data, cx,cy);

                                }else if(arc._model.circumference<0.628){


                                    var textStart= calc(arc._model.startAngle, arc._model.endAngle, arc._model.outerRadius*1.1, arc._model.outerRadius, chartCenterX, chartCenterY);
                                    var lineStart= calc(arc._model.startAngle, arc._model.endAngle, arc._model.outerRadius, arc._model.outerRadius*0.8, chartCenterX, chartCenterY);
                                    var textCenterX = textStart.x;
                                    var textCenterY = textStart.y;
                                    if(textCenterY>arc._model.y+arc._model.outerRadius-20)
                                    {
                                        textCenterY=arc._model.y+arc._model.outerRadius-20;
                                        textCenterX=textStart.x>arcCenter.x?textStart.x+50+textshift:textStart.x-50-textshift;
                                        textshift=50;

                                    }else if(textCenterY<arc._model.y-arc._model.outerRadius+20)
                                    {
                                        textCenterY=arc._model.y-arc._model.outerRadius+20;
                                        textCenterX=textStart.x>arcCenter.x?textStart.x+50+textshift:textStart.x-50-textshift;
                                        textshift=50;

                                    }else{
                                        textCenterX=textStart.x>arcCenter.x?textCenterX+textshift:textCenterX-textshift;
                                        textshift=0;
                                    };


                                    ctx.strokeStyle=arc._model.backgroundColor;
                                    ctx.beginPath();
                                    ctx.moveTo(lineStart.x,lineStart.y);
                                    ctx.lineTo(textCenterX,textCenterY>chartCenterY?textCenterY+13:textCenterY);
                                    ctx.lineTo(textCenterX+(textStart.x>arcCenter.x?50:-50),textCenterY>chartCenterY?textCenterY+13:textCenterY);
                                    ctx.stroke();
                                    ctx.font="16px Arial";

                                    ctx.textAlign = textStart.x>arcCenter.x?'left':'right';
                                    ctx.textBaseline = 'bottom';
                                    ctx.fillStyle="#006080";
                                    ctx.fillText( arc._model.label+' '+data,
                                        textCenterX, textCenterY>chartCenterY?textCenterY+13:textCenterY);

                                    ctx.textAlign = 'center';
                                    ctx.textBaseline = 'middle';

                                    ctx.fillStyle=changeColor(arc._model.backgroundColor);
                                    ctx.fillText(Math.round(data*100/total)+'%',
                                        arcCenter.x,arcCenter.y);
                                }else if(arc._model.circumference>=0.628){
                                    var arcCenterX = arcCenter.x;
                                    var arcCenterY = arcCenter.y;
                                    ctx.font="20px Arial";
                                    ctx.textAlign = 'center';
                                    ctx.textBaseline = 'bottom';

                                    ctx.fillStyle=changeColor(arc._model.backgroundColor);

                                    ctx.fillText(Math.round(data*100/total)+'%', arcCenterX, arcCenterY<chartCenterY?arcCenterY+15:arcCenterY-5);
                                    ctx.font="16px Arial";

                                    ctx.fillText(arc._model.label+' '+data, arcCenterX, arcCenterY>=chartCenterY?arcCenterY+15:arcCenterY-5);

                                }

                            }

                        });
                    });
                }
            },

為了提高顯示效果,針對對于5%暑竟、5% ~ 10%之間斋射、超過10%分開處理。達(dá)到自己覺得還滿意的結(jié)果但荤。

ps:還得帶一個外掛罗岖,計(jì)算圓環(huán)的中心坐標(biāo)。

    function calc(startAngle, endAngle, outerRadius, innerRadius ,x,y ) {
        var centreAngle = startAngle + ((endAngle - startAngle) / 2);
        var rangeFromCentre = (outerRadius - innerRadius) / 2 + innerRadius;
        return {
            x: x + (Math.cos(centreAngle) * rangeFromCentre),
            y: y + (Math.sin(centreAngle) * rangeFromCentre)
        }
    };

為了讓隨機(jī)得到的顏色上面的字體顯示效果更好腹躁,設(shè)置了一個反差色的函數(shù)changeColor()桑包,這個在下一篇文章里面分享吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纺非,一起剝皮案震驚了整個濱河市哑了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烧颖,老刑警劉巖弱左,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炕淮,居然都是意外死亡拆火,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來们镜,“玉大人币叹,你說我怎么就攤上這事∧O粒” “怎么了颈抚?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚼鹉。 經(jīng)常有香客問我贩汉,道長,這世上最難降的妖魔是什么反砌? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任雾鬼,我火速辦了婚禮,結(jié)果婚禮上宴树,老公的妹妹穿的比我還像新娘策菜。我一直安慰自己,他們只是感情好酒贬,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布又憨。 她就那樣靜靜地躺著,像睡著了一般锭吨。 火紅的嫁衣襯著肌膚如雪蠢莺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天零如,我揣著相機(jī)與錄音躏将,去河邊找鬼。 笑死考蕾,一個胖子當(dāng)著我的面吹牛祸憋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肖卧,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚯窥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塞帐?” 一聲冷哼從身側(cè)響起拦赠,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葵姥,沒想到半個月后荷鼠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牌里,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年颊咬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了务甥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牡辽。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡喳篇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出态辛,到底是詐尸還是另有隱情麸澜,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布奏黑,位于F島的核電站炊邦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏熟史。R本人自食惡果不足惜馁害,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹂匹。 院中可真熱鬧碘菜,春花似錦、人聲如沸限寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽履植。三九已至计雌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玫霎,已是汗流浹背凿滤。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庶近,地道東北人翁脆。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像拦盹,于是被迫代替她去往敵國和親鹃祖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡介 1.1什么是canvas普舆? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,691評論 2 32
  • 當(dāng)你不隨我去做某件事時(shí)恬口,我就會很生氣,甚至有些悲傷沼侣。我心里第一反應(yīng)就是:愛的越深祖能,傷的越深。 為什...
    小惠慧子閱讀 272評論 0 0
  • 對于餃子控的我而言蛾洛,每每空閑下來养铸,總是想自己動手包來吃雁芙,而每次都是一個樣的包法。 一直都想變著法子給...
    如若清風(fēng)閱讀 219評論 2 2