UNPKG

@amcharts/amcharts4

Version:
286 lines (257 loc) 10 kB
import * as am4core from "@amcharts/amcharts4/core"; import * as am4charts from "@amcharts/amcharts4/charts"; import am4themes_animated from "@amcharts/amcharts4/themes/animated"; /** * -------------------------------------------------------- * This demo was created using amCharts V4 preview release. * * V4 is the latest installement in amCharts data viz * library family, to be released in the first half of * 2018. * * For more information and documentation visit: * https://www.amcharts.com/docs/v4/ * -------------------------------------------------------- */ am4core.useTheme(am4themes_animated); var chart = am4core.create("chartdiv", am4charts.ChordDiagram); // colors of main characters chart.colors.saturation = 0.45; chart.colors.step = 3; var colors = { Rachel:chart.colors.next(), Monica:chart.colors.next(), Phoebe:chart.colors.next(), Ross:chart.colors.next(), Joey:chart.colors.next(), Chandler:chart.colors.next() } // data was provided by: https://www.reddit.com/user/notrudedude chart.data = [ // node property fields take data from data items where they are first mentioned, that's // why we add empty data items at the beginning and set colors here {"from":"Monica", "image":"monica.png", "color":colors.Monica}, {"from":"Rachel", "image":"rachel.png", "color":colors.Rachel}, {"from":"Chandler", "image":"chandler.png", "color":colors.Chandler}, {"from":"Ross", "image":"ross.png", "color":colors.Ross}, {"from":"Joey", "color":colors.Joey, "image":"joey.png",}, {"from":"Phoebe", "image":"phoebe.png", "color":colors.Phoebe}, // real data {"from":"Monica","to":"Rachel","value":4}, {"from":"Monica","to":"Chandler","value":113}, {"from":"Monica","to":"Ross","value":16}, {"from":"Monica","to":"Joey","value":9}, {"from":"Monica","to":"Phoebe","value":3}, {"from":"Monica","to":"Paul the wine guy","value":1}, {"from":"Monica","to":"Mr Geller","value":6}, {"from":"Monica","to":"Mrs Geller","value":5}, {"from":"Monica","to":"Aunt Lilian","value":1}, {"from":"Monica","to":"Nana","value":1}, {"from":"Monica","to":"Young Ethan","value":5}, {"from":"Monica","to":"Ben","value":3}, {"from":"Monica","to":"Fun Bobby","value":3}, {"from":"Monica","to":"Richard","value":16}, {"from":"Monica","to":"Mrs Green","value":1}, {"from":"Monica","to":"Paolo2","value":1}, {"from":"Monica","to":"Pete","value":10}, {"from":"Monica","to":"Chip","value":1}, {"from":"Monica","to":"Timothy (Burke)","value":1}, {"from":"Monica","to":"Emily","value":1}, {"from":"Monica","to":"Dr. Roger","value":3}, {"from":"Rachel","to":"Chandler","value":7}, {"from":"Rachel","to":"Ross","value":80}, {"from":"Rachel","to":"Joey","value":30}, {"from":"Rachel","to":"Phoebe","value":6}, {"from":"Rachel","to":"Paolo","value":5}, {"from":"Rachel","to":"Mr Geller","value":2}, {"from":"Rachel","to":"Mrs Geller","value":1}, {"from":"Rachel","to":"Barry","value":1}, {"from":"Rachel","to":"Dr Green","value":3}, {"from":"Rachel","to":"Mark3","value":1}, {"from":"Rachel","to":"Josh","value":2}, {"from":"Rachel","to":"Gunther","value":1}, {"from":"Rachel","to":"Joshua","value":3}, {"from":"Rachel","to":"Danny","value":1}, {"from":"Rachel","to":"Mr. Zelner","value":1}, {"from":"Rachel","to":"Paul Stevens","value":3}, {"from":"Rachel","to":"Tag","value":4}, {"from":"Rachel","to":"Melissa","value":1}, {"from":"Rachel","to":"Gavin","value":2}, {"from":"Chandler","to":"Joey","value":1}, {"from":"Chandler","to":"Phoebe","value":7}, {"from":"Chandler","to":"Aurora","value":2}, {"from":"Chandler","to":"Jill Goodacre","value":1}, {"from":"Chandler","to":"Janice","value":11}, {"from":"Chandler","to":"Mrs Bing","value":3}, {"from":"Chandler","to":"Nina","value":1}, {"from":"Chandler","to":"Susie","value":5}, {"from":"Chandler","to":"Mary Theresa","value":1}, {"from":"Chandler","to":"Ginger","value":2}, {"from":"Chandler","to":"Joanna","value":5}, {"from":"Chandler","to":"Kathy","value":7}, {"from":"Chandler","to":"Mr Bing","value":1}, {"from":"Ross","to":"Joey","value":3}, {"from":"Ross","to":"Phoebe","value":18}, {"from":"Ross","to":"Carol","value":10}, {"from":"Ross","to":"Mrs Geller","value":8}, {"from":"Ross","to":"Aunt Lilian","value":1}, {"from":"Ross","to":"Mrs Bing","value":3}, {"from":"Ross","to":"Celia","value":2}, {"from":"Ross","to":"Julie","value":6}, {"from":"Ross","to":"Ben","value":6}, {"from":"Ross","to":"Mrs Green","value":2}, {"from":"Ross","to":"Chloe","value":1}, {"from":"Ross","to":"Bonnie","value":4}, {"from":"Ross","to":"Messy Girl (Cheryl)","value":5}, {"from":"Ross","to":"Emily","value":12}, {"from":"Ross","to":"Jill","value":1}, {"from":"Ross","to":"Elizabeth","value":8}, {"from":"Ross","to":"Aunt Millie","value":2}, {"from":"Ross","to":"Mona","value":11}, {"from":"Ross","to":"Emma","value":7}, {"from":"Ross","to":"Charlie","value":10}, {"from":"Joey","to":"Phoebe","value":6}, {"from":"Joey","to":"Janice","value":1}, {"from":"Joey","to":"Lorraine","value":2}, {"from":"Joey","to":"Melanie","value":2}, {"from":"Joey","to":"Erica","value":2}, {"from":"Joey","to":"Mrs Green","value":1}, {"from":"Joey","to":"Kate","value":4}, {"from":"Joey","to":"Lauren","value":2}, {"from":"Joey","to":"Estelle","value":1}, {"from":"Joey","to":"Kathy","value":2}, {"from":"Joey","to":"Emily","value":4}, {"from":"Joey","to":"Katie","value":2}, {"from":"Joey","to":"Janine","value":9}, {"from":"Joey","to":"Erin","value":1}, {"from":"Joey","to":"Cecilia","value":3}, {"from":"Joey","to":"Charlie","value":3}, {"from":"Phoebe","to":"David","value":14}, {"from":"Phoebe","to":"Roger","value":1}, {"from":"Phoebe","to":"Duncan","value":1}, {"from":"Phoebe","to":"Rob Dohnen","value":2}, {"from":"Phoebe","to":"Ryan","value":5}, {"from":"Phoebe","to":"Malcom","value":1}, {"from":"Phoebe","to":"Robert","value":1}, {"from":"Phoebe","to":"Sergei","value":1}, {"from":"Phoebe","to":"Vince","value":2}, {"from":"Phoebe","to":"Jason","value":1}, {"from":"Phoebe","to":"Rick","value":2}, {"from":"Phoebe","to":"Gunther","value":1}, {"from":"Phoebe","to":"Gary","value":7}, {"from":"Phoebe","to":"Jake","value":2}, {"from":"Phoebe","to":"Eric","value":3}, {"from":"Phoebe","to":"Mike","value":18}, {"from":"Carol","to":"Ben","value":1}, {"from":"Carol","to":"Susan","value":1}, {"from":"Mr Geller","to":"Mrs Geller","value":3}, {"from":"Frank","to":"Alice","value":5}] chart.dataFields.fromName = "from"; chart.dataFields.toName = "to"; chart.dataFields.value = "value"; chart.nodePadding = 0.5; chart.minNodeSize = 0.01; chart.startAngle = 80; chart.endAngle = chart.startAngle + 360; chart.sortBy = "value"; var nodeTemplate = chart.nodes.template; nodeTemplate.readerTitle = "Click to show/hide or drag to rearrange"; nodeTemplate.showSystemTooltip = true; nodeTemplate.propertyFields.fill = "color"; nodeTemplate.tooltipText = "{name}'s kisses: {total}"; // when rolled over the node, make all the links rolled-over nodeTemplate.events.on("over", (event)=>{ var node = event.target; node.outgoingDataItems.each((dataItem)=>{ if(dataItem.toNode){ dataItem.link.isHover = true; dataItem.toNode.label.isHover = true; } }) node.incomingDataItems.each((dataItem)=>{ if(dataItem.fromNode){ dataItem.link.isHover = true; dataItem.fromNode.label.isHover = true; } }) node.label.isHover = true; }) // when rolled out from the node, make all the links rolled-out nodeTemplate.events.on("out", (event)=>{ var node = event.target; node.outgoingDataItems.each((dataItem)=>{ if(dataItem.toNode){ dataItem.link.isHover = false; dataItem.toNode.label.isHover = false; } }) node.incomingDataItems.each((dataItem)=>{ if(dataItem.fromNode){ dataItem.link.isHover = false; dataItem.fromNode.label.isHover = false; } }) node.label.isHover = false; }) var label = nodeTemplate.label; label.relativeRotation = 90; label.fillOpacity = 0.25; let labelHS = label.states.create("hover"); labelHS.properties.fillOpacity = 1; nodeTemplate.cursorOverStyle = am4core.MouseCursorStyle.pointer; // this adapter makes non-main character nodes to be filled with color of the main character which he/she kissed most nodeTemplate.adapter.add("fill", (fill, target)=>{ let node = target; let counters = {}; let mainChar = false; node.incomingDataItems.each((dataItem)=>{ if(colors[dataItem.toName]){ mainChar = true; } if(isNaN(counters[dataItem.fromName])){ counters[dataItem.fromName] = dataItem.value; } else{ counters[dataItem.fromName] += dataItem.value; } }) if(mainChar){ return fill; } let count = 0; let color; let biggest = 0; let biggestName; for(var name in counters){ if(counters[name] > biggest){ biggestName = name; biggest = counters[name]; } } if(colors[biggestName]){ fill = colors[biggestName]; } return fill; }) // link template var linkTemplate = chart.links.template; linkTemplate.strokeOpacity = 0; linkTemplate.fillOpacity = 0.1; linkTemplate.tooltipText = "{fromName} & {toName}:{value.value}"; var hoverState = linkTemplate.states.create("hover"); hoverState.properties.fillOpacity = 0.7; hoverState.properties.strokeOpacity = 0.7; // data credit label var creditLabel = chart.chartContainer.createChild(am4core.TextLink); creditLabel.text = "Data source: notrudedude"; creditLabel.url = "https://www.reddit.com/user/notrudedude"; creditLabel.y = am4core.percent(99); creditLabel.x = am4core.percent(99); creditLabel.horizontalCenter = "right"; creditLabel.verticalCenter = "bottom"; var titleImage = chart.chartContainer.createChild(am4core.Image); titleImage.href = "whokissed.png"; titleImage.x = 30 titleImage.y = 30; titleImage.width = 200; titleImage.height = 200;