弦表圖(矩陣)

弦表圖

主要用于顯示矩陣關(guān)系的表圖

  • 注1:所有圖形的路徑都是從容器所在位置開始計算的
  • 注2:所有dom綁定的數(shù)據(jù)都是新拷貝一份的 不會修改原對象

示例矩陣關(guān)系:

亞洲 非洲 歐洲 美洲 太平洋
亞洲 9000 870 3000 1000 5200
非洲 2000 2870 7700 4881 4050
歐洲 3540 3870 1200 7000 3200
美洲 5540 1870 5300 5000 4200
太平洋 8540 6870 4400 1000 7200
    const width = 700, height = 500, padding = {top: 60, left: 30};
    const svg = d3.select("body").append("svg").attr("width", width + padding.left * 2).attr("height", height + padding.top * 2);
    const container = ["亞洲", "非洲", "歐洲", "美洲", "太平洋"];
    //    聲明矩陣數(shù)據(jù)
    const population = [
        [9000, 870, 3000, 1000, 5200],
        [2000, 2870, 7700, 4881,4050],
        [3540, 3870, 1200, 7000, 3200],
        [5540, 1870, 5300, 5000, 4200],
        [8540, 6870, 4400, 1000, 7200]
    ];
    //    創(chuàng)建弦圖布局
    const chord = d3.layout.chord()
        .padding(.02)
        //        給分組排序
        //        給弦上分布大小排序
        .sortSubgroups(d3.ascending)
        //        設(shè)置矩陣
        .matrix(population);
    //        創(chuàng)建一個容器 把整體圖形移動 path的坐標系是相對父容器的
    /*生成的分組中是這樣的 用于做外圈的弧  value是總和
    [{
         index: 0,
         startAngle: 0,
         endAngle: 1.1092402123019984,
         value: 19070,
         angle: 0.5546201061509992
     },...]
     */
    console.log(chord.groups());
    console.log(chord.chords());
    const gChord = svg.append("g")
        .attr("transform", "translate(" + width / 2 + "," + (height / 2 + padding.top) + ")");
    //    創(chuàng)建一個外圈圖形容器
    const gOuter = gChord.append("g");
    //    創(chuàng)建內(nèi)圈圖形容器
    const gInner = gChord.append("g");
    const color = d3.scale.category20();
    //    內(nèi)圈半徑為svg一半的0.7倍
    const innerRadius = width / 2 * .7;
    //    外圈半徑為內(nèi)圈半徑的1.1倍
    const outerRadius = innerRadius * 1.1;
    //    創(chuàng)建弧形生成器
    const actOuter = d3.svg.arc()
        .innerRadius(innerRadius)
        .outerRadius(outerRadius);
    //    創(chuàng)建外圈的弧形
    gOuter.selectAll(".outerPath")
        .data(chord.groups())
        .enter()
        .append("path")
        .style("stroke", "black")
        .attr("class", "outerPath")
        .style("fill", function (d) {
            return color(d.index);
        })
//        用groups中的startAngle和endAngle生成外圈弧形
        .attr("d", actOuter);
//        給外圈弧形創(chuàng)建文字
    gOuter.selectAll(".outerText")
        .data(chord.groups())
        .enter()
        .append("text")
//        遍歷綁定的數(shù)據(jù)并計算出數(shù)字旋轉(zhuǎn)角度
        .each(function (d, i) {
//            開始角度加結(jié)束角度的一半 為弧中心角度
            d.angle = (d.startAngle + d.endAngle) / 2;
            d.name = container[i];
        })
        .attr("class", "outerText")
        .attr("dy", ".35em")
        .attr("transform", function (d) {
//            旋轉(zhuǎn)計算出的角度
            var result = "rotate(" + (d.angle * 180 / Math.PI) + ")";
//            平移到外圈外面
            result += "translate(0," + -(outerRadius + 10) + ")";
//如果角度是大于3/4的半圓并且小于5/4的半圓就讓文字翻轉(zhuǎn)180°正過來顯示
            if (d.angle > Math.PI * 3 / 4 && d.angle < Math.PI * 5 / 4) {
                result += "rotate(180)";
            }
            return result;
        })
        .text(function (d) {
            return d.name;
        });
//    chord.chords()生成是一個符合弦生成器的數(shù)組
/*[
{source:{
 index: 0,
 startAngle: 0,
 endAngle: 1.1092402123019984,
 value: 19070,
 angle: 0.5546201061509992
 },target:{
 index: 0,
 startAngle: 0,
 endAngle: 1.1092402123019984,
 value: 19070,
 angle: 0.5546201061509992
 }}
 ]*/
    const arcInner = d3.svg.chord().radius(innerRadius);
    gInner.selectAll(".innerPath")
        .data(chord.chords())
        .enter()
        .append("path")
        .attr("class", "innerPath")
//        直接把數(shù)據(jù)給弦生成器生成弦圖形
        .attr("d", arcInner)
        .style("stroke", "black")
        .style("fill", function (d) {
            return color(d.source.index);
        });
//    給所有外圈弦綁定事件 觸發(fā)事件時修改所有圖形透明度
    gOuter.selectAll(".outerPath")
        .on("mouseover", fade(0.0))
        .on("mouseout", fade(1.0));
    function fade(opacity) {
        return function (g, i) {
            gInner.selectAll(".innerPath")
                .filter(function (d) {
                    return d.source.index != i && d.target.index != i;
                })
                .transition()
                .style("opacity", opacity);
        }
    }

結(jié)果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末产镐,一起剝皮案震驚了整個濱河市猜敢,隨后出現(xiàn)的幾起案子脑漫,更是在濱河造成了極大的恐慌秸仙,老刑警劉巖满钟,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胜榔,死亡現(xiàn)場離奇詭異,居然都是意外死亡湃番,警方通過查閱死者的電腦和手機夭织,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吠撮,“玉大人摔癣,你說我怎么就攤上這事∥诚颍” “怎么了择浊?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逾条。 經(jīng)常有香客問我琢岩,道長,這世上最難降的妖魔是什么师脂? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任担孔,我火速辦了婚禮,結(jié)果婚禮上吃警,老公的妹妹穿的比我還像新娘糕篇。我一直安慰自己,他們只是感情好酌心,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布拌消。 她就那樣靜靜地躺著,像睡著了一般安券。 火紅的嫁衣襯著肌膚如雪墩崩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天侯勉,我揣著相機與錄音鹦筹,去河邊找鬼。 笑死址貌,一個胖子當(dāng)著我的面吹牛铐拐,可吹牛的內(nèi)容都是我干的徘键。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼遍蟋,長吁一口氣:“原來是場噩夢啊……” “哼吹害!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匿值,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赠制,失蹤者是張志新(化名)和其女友劉穎赂摆,沒想到半個月后挟憔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡烟号,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年绊谭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汪拥。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡达传,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迫筑,到底是詐尸還是另有隱情宪赶,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布脯燃,位于F島的核電站搂妻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辕棚。R本人自食惡果不足惜欲主,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逝嚎。 院中可真熱鬧扁瓢,春花似錦、人聲如沸补君。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挽铁。三九已至她紫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿储,已是汗流浹背贿讹。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留够掠,地道東北人民褂。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赊堪。 傳聞我的和親對象是個殘疾皇子面殖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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