@amcharts/amcharts4
Version:
amCharts 4
286 lines (257 loc) • 10 kB
JavaScript
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;