Ternary Plots in JavaScript

How to create D3.js-based ternary plots. Examples of Ternary Plots with plotly.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Try Plotly Studio now.

var rawData = [
    {journalist:75,developer:25,designer:0,label:'point 1'},
    {journalist:70,developer:10,designer:20,label:'point 2'},
    {journalist:75,developer:20,designer:5,label:'point 3'},
    {journalist:5,developer:60,designer:35,label:'point 4'},
    {journalist:10,developer:80,designer:10,label:'point 5'},
    {journalist:10,developer:90,designer:0,label:'point 6'},
    {journalist:20,developer:70,designer:10,label:'point 7'},
    {journalist:10,developer:20,designer:70,label:'point 8'},
    {journalist:15,developer:5,designer:80,label:'point 9'},
    {journalist:10,developer:10,designer:80,label:'point 10'},
    {journalist:20,developer:10,designer:70,label:'point 11'},
];

Plotly.newPlot('myDiv', [{
    type: 'scatterternary',
    mode: 'markers',
    a: rawData.map(function(d) { return d.journalist; }),
    b: rawData.map(function(d) { return d.developer; }),
    c: rawData.map(function(d) { return d.designer; }),
    text: rawData.map(function(d) { return d.label; }),
    marker: {
        symbol: 100,
        color: '#DB7365',
        size: 14,
        line: { width: 2 }
    },
}], {
    ternary: {
        sum: 100,
        aaxis: makeAxis('Journalist', 0),
        baxis: makeAxis('<br>Developer', 45),
        caxis: makeAxis('<br>Designer', -45),
        bgcolor: '#fff1e0'
    },
    annotations: [{
      showarrow: false,
      text: 'Replica of Tom Pearson\'s <a href="/?originalUrl=https%3A%2F%2Fplotly.com%2F%26quot%3Bhttp%3A%2F%2Fbl.ocks.org%2Ftomgp%2F7674234%26quot%3B%26gt%3Bblock%26lt%3B%2Fa%26gt%3B",
        x: 1.0,
        y: 1.3,
        font: { size: 15 }
    }],
    paper_bgcolor: '#fff1e0',
});

function makeAxis(title, tickangle) {
    return {
        title: {
            text: title,
            font: {
                size: 20
            }
        },
        tickangle: tickangle,
        tickfont: {
            size: 15
        },
        tickcolor: 'rgba(0,0,0,0)',
        ticklen: 5,
        showline: true,
        showgrid: true
    };
}
Inspired from Tom Pearson's block
</script>\n</head>\n\n<body>\n\t<div id='myDiv'><!-- Plotly chart will be drawn inside this DIV --></div>\n</body>","js":"var rawData = [\n {journalist:75,developer:25,designer:0,label:'point 1'},\n {journalist:70,developer:10,designer:20,label:'point 2'},\n {journalist:75,developer:20,designer:5,label:'point 3'},\n {journalist:5,developer:60,designer:35,label:'point 4'},\n {journalist:10,developer:80,designer:10,label:'point 5'},\n {journalist:10,developer:90,designer:0,label:'point 6'},\n {journalist:20,developer:70,designer:10,label:'point 7'},\n {journalist:10,developer:20,designer:70,label:'point 8'},\n {journalist:15,developer:5,designer:80,label:'point 9'},\n {journalist:10,developer:10,designer:80,label:'point 10'},\n {journalist:20,developer:10,designer:70,label:'point 11'},\n];\n\nPlotly.newPlot('myDiv', [{\n type: 'scatterternary',\n mode: 'markers',\n a: rawData.map(function(d) { return d.journalist; }),\n b: rawData.map(function(d) { return d.developer; }),\n c: rawData.map(function(d) { return d.designer; }),\n text: rawData.map(function(d) { return d.label; }),\n marker: {\n symbol: 100,\n color: '#DB7365',\n size: 14,\n line: { width: 2 }\n },\n}], {\n ternary: {\n sum: 100,\n aaxis: makeAxis('Journalist', 0),\n baxis: makeAxis('<br>Developer', 45),\n caxis: makeAxis('<br>Designer', -45),\n bgcolor: '#fff1e0'\n },\n annotations: [{\n showarrow: false,\n text: 'Replica of Tom Pearson\\'s <a href="/?originalUrl=https%3A%2F%2Fplotly.com%2F%26quot%3Bhttp%3A%2F%2Fbl.ocks.org%2Ftomgp%2F7674234%2F%26quot%3B%26gt%3Bblock%26lt%3B%2Fa%26gt%3B%26%2339%3B%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520x%3A%25201.0%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520y%3A%25201.3%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520font%3A%2520%7B%2520size%3A%252015%2520%7D%5Cn%2520%2520%2520%2520%7D%5D%2C%5Cn%2520%2520%2520%2520paper_bgcolor%3A%2520%26%2339%3B%23fff1e0%26%2339%3B%2C%5Cn%7D)%3B%5Cn%5Cnfunction%2520makeAxis(title%2C%2520tickangle)%2520%7B%5Cn%2520%2520%2520%2520return%2520%7B%5Cn%2520%2520%2520%2520%2520%2520%2520%2520title%3A%2520%7B%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520text%3A%2520title%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520font%3A%2520%7B%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520size%3A%252020%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%7D%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520tickangle%3A%2520tickangle%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520tickfont%3A%2520%7B%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520size%3A%252015%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%7D%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520tickcolor%3A%2520%26%2339%3Brgba(0%2C0%2C0%2C0)%26%2339%3B%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520ticklen%3A%25205%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520showline%3A%2520true%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520showgrid%3A%2520true%5Cn%2520%2520%2520%2520%7D%3B%5Cn%7D%5Cn%26quot%3B%7D">
var url = 'https://gist.githubusercontent.com/davenquinn/988167471993bc2ece29/raw/f38d9cb3dd86e315e237fde5d65e185c39c931c2/data.json';

d3.json(url, function(err, rawData) {
    if(err) throw err;

    plot(rawData);
});

function plot(rawData) {
    var data = Object.keys(rawData).map(function(k) {
        var pts = rawData[k];

        return {
            type: 'scatterternary',
            mode: 'lines',
            name: k,
            a: pts.map(function(d) { return d.clay }),
            b: pts.map(function(d) { return d.sand }),
            c: pts.map(function(d) { return d.silt }),
            line: { color: '#c00' }
        };
    });

    var layout = {
        ternary: {
            sum: 100,
            aaxis: makeAxis('Clay'),
            baxis: makeAxis('Sand'),
            caxis: makeAxis('Silt')
        },
        showlegend: false,
        width: 700,
        annotations: [{
            showarrow: false,
            text: 'Replica of Daven Quinn\'s <a href="/?originalUrl=https%3A%2F%2Fplotly.com%2F%26quot%3Bhttp%3A%2F%2Fbl.ocks.org%2Fdavenquinn%2F988167471993bc2ece29%26quot%3B%26gt%3Bblock%26lt%3B%2Fa%26gt%3B",
            x: 0.15,
            y: 1.1
        }]
    };

    Plotly.newPlot('myDiv', data, layout);
}

function makeAxis(title) {
  return {
      title: {
         text: title
      },
      ticksuffix: '%',
      min: 0.01,
      linewidth: 2,
      ticks: 'outside',
      ticklen: 8,
      showgrid: true,
  };
}
Inspired from Daven Quinn's block
</script>\n\t<script src="/?originalUrl=https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fd3%2F3.5.17%2Fd3.min.js"></script>\n</head>\n\n<body>\n\t<div id='myDiv'><!-- Plotly chart will be drawn inside this DIV --></div>\n</body>","js":"var url = 'https://gist.githubusercontent.com/davenquinn/988167471993bc2ece29/raw/f38d9cb3dd86e315e237fde5d65e185c39c931c2/data.json';\n\nd3.json(url, function(err, rawData) {\n if(err) throw err;\n\n plot(rawData);\n});\n\nfunction plot(rawData) {\n var data = Object.keys(rawData).map(function(k) {\n var pts = rawData[k];\n\n return {\n type: 'scatterternary',\n mode: 'lines',\n name: k,\n a: pts.map(function(d) { return d.clay }),\n b: pts.map(function(d) { return d.sand }),\n c: pts.map(function(d) { return d.silt }),\n line: { color: '#c00' }\n };\n });\n\n var layout = {\n ternary: {\n sum: 100,\n aaxis: makeAxis('Clay'),\n baxis: makeAxis('Sand'),\n caxis: makeAxis('Silt')\n },\n showlegend: false,\n width: 700,\n annotations: [{\n showarrow: false,\n text: 'Replica of Daven Quinn\\'s <a href="/?originalUrl=https%3A%2F%2Fplotly.com%2F%26quot%3Bhttp%3A%2F%2Fbl.ocks.org%2Fdavenquinn%2F988167471993bc2ece29%2F%26quot%3B%26gt%3Bblock%26lt%3B%2Fa%26gt%3B%26%2339%3B%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520x%3A%25200.15%2C%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520y%3A%25201.1%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%7D%5D%5Cn%2520%2520%2520%2520%7D%3B%5Cn%5Cn%2520%2520%2520%2520Plotly.newPlot(%26%2339%3BmyDiv%26%2339%3B%2C%2520data%2C%2520layout)%3B%5Cn%7D%5Cn%5Cnfunction%2520makeAxis(title)%2520%7B%5Cn%2520%2520return%2520%7B%5Cn%2520%2520%2520%2520%2520%2520title%3A%2520%7B%5Cn%2520%2520%2520%2520%2520%2520%2520%2520%2520text%3A%2520title%5Cn%2520%2520%2520%2520%2520%2520%7D%2C%5Cn%2520%2520%2520%2520%2520%2520ticksuffix%3A%2520%26%2339%3B%25%26%2339%3B%2C%5Cn%2520%2520%2520%2520%2520%2520min%3A%25200.01%2C%5Cn%2520%2520%2520%2520%2520%2520linewidth%3A%25202%2C%5Cn%2520%2520%2520%2520%2520%2520ticks%3A%2520%26%2339%3Boutside%26%2339%3B%2C%5Cn%2520%2520%2520%2520%2520%2520ticklen%3A%25208%2C%5Cn%2520%2520%2520%2520%2520%2520showgrid%3A%2520true%2C%5Cn%2520%2520%7D%3B%5Cn%7D%5Cn%26quot%3B%7D">