aaDrag to rearrangebbDrag to rearrangeccDrag to rearrangeddDrag to rearrangeeeDrag to rearrangeffDrag to rearrangeggDrag to rearrangehhDrag to rearrangeiiDrag to rearrangejjDrag to rearrangekkDrag to rearrangellDrag to rearrangemmDrag to rearrangennDrag to rearrangeooDrag to rearrangeppDrag to rearrangeqqDrag to rearrangerrDrag to rearrangessDrag to rearrangettDrag to rearrangeuuDrag to rearrangevvDrag to rearrangewwDrag to rearrangexxDrag to rearrangeyyDrag to rearrangezzDrag to rearrange100%Chart created using amCharts library
  • Open in:

Non-ribbon Chord diagram

Compared to traditional Chord diagrams, Non-ribbon chord diagrams emphasize the connections between data points rather than additional properties of those connections.

Demo source

<!-- Styles -->
<style>
#chartdiv {
  width: 100%;
  height: 500px;
}

</style>

<!-- Resources -->
<script src="https://cdn.amcharts.com/lib/4/core.js"></script>
<script src="https://cdn.amcharts.com/lib/4/charts.js"></script>
<script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script>

<!-- Chart code -->
<script>
am4core.ready(function() {

// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end

var chart = am4core.create("chartdiv", am4charts.ChordDiagram);
chart.hiddenState.properties.opacity = 0;

var data = [];
var letters = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];

function randomLetter(except) {
    var letter = letters[Math.floor(Math.random() * (letters.length - 1))];
    if (letter == except) {
        return randomLetter(except);
    }
    else {
        return letter;
    }
}

for (var i = 0; i < letters.length; i++) {
    var fromLetter = letters[i];
    for (var o = 0; o < 3; o++) {
        data.push({ from: fromLetter, to: randomLetter(fromLetter), value: Math.round(Math.random() * 100) });
    }
}

chart.data = data;

chart.dataFields.fromName = "from";
chart.dataFields.toName = "to";
chart.dataFields.value = "value";
chart.nonRibbon = true;
chart.sortBy = "name";
chart.startAngle = 90;
chart.endAngle = 450;

var nodeTemplate = chart.nodes.template;
nodeTemplate.fill = chart.colors.getIndex(0);
nodeTemplate.fillOpacity = 0.4;
nodeTemplate.slice.disabled = true;
nodeTemplate.setStateOnChildren = true;
nodeTemplate.label.disabled = true;
nodeTemplate.togglable = false;

nodeTemplate.readerTitle = "Drag to rearrange";
nodeTemplate.showSystemTooltip = true;

var hoverState = nodeTemplate.states.create("hover");
hoverState.properties.fillOpacity = 1;

var linkTemplate = chart.links.template;
linkTemplate.opacity = 0.1;
linkTemplate.stroke = chart.colors.getIndex(0);
linkTemplate.defaultState.properties.opacity = 0.1;
linkTemplate.tooltipText = "";

var linkHoverState = linkTemplate.states.create("hover");
linkHoverState.properties.opacity = 1;

nodeTemplate.events.on("over", function (event) {
    var node = event.target;
    node.outgoingDataItems.each(function (dataItem) {
        dataItem.link.isHover = true;
    })
})

nodeTemplate.events.on("out", function (event) {
    var node = event.target;
    node.outgoingDataItems.each(function (dataItem) {
        dataItem.link.isHover = false;
    })
})

nodeTemplate.cursorOverStyle = am4core.MouseCursorStyle.grab;

nodeTemplate.cursorDownStyle = am4core.MouseCursorStyle.grabbing;

var circleBullet = nodeTemplate.createChild(am4charts.CircleBullet);
circleBullet.setStateOnChildren = true;
circleBullet.circle.radius = 15;

var circleHoverState = circleBullet.states.create("hover");
circleHoverState.properties.scale = 1.5;

// we create a separate label as node.label ispositioned differently and doesn't fit perfectly for one-letter labels
var label = circleBullet.createChild(am4core.Label);
label.text = "{name}";
label.horizontalCenter = "middle";
label.verticalCenter = "middle";

var labelHoverState = label.states.create("hover");
labelHoverState.properties.fill = am4core.color("#ffffff");

}); // end am4core.ready()
</script>

<!-- HTML -->
<div id="chartdiv"></div>