Python Bubble Charts are similar to Scatter Charts but with a varying bubble/marker size. The size of the bubble represents third dimension of the data. Demo also includes source-code that you can try running locally.
<!-- index.html --> {% load static %} <html> <head> <title>CanvasJS Python Charts</title> <script> window.onload = function () { var chart = new CanvasJS.Chart("chartContainer", { animationEnabled: true, zoomEnabled: true, title: { text: "Crude Birth Rate vs Crude Death Rate", fontFamily: "Verdana" }, axisX: { title: "Crude Death Rate" }, axisY: { title: "Crude Birth Rate", includeZero: true }, legend: { horizontalAlign: "right", dockInsidePlotArea: "inside" }, data: [{ type: "bubble", xValueFormatString: "#,#0.0", yValueFormatString: "#,#0.0", zValueFormatString: "#,#0.0", showInLegend: true, legendText: "Size of Bubble Represents Population", toolTipContent: "<b>{name}</b><br/>Crude Death Rate: {x} <br/> Crude Birth Rate: {y}<br/> Population: {z}mn", dataPoints: {{ crude_data|safe }} }] }); chart.render(); } </script> </head> <body> <div id="chartContainer" style="width: 100%; height: 360px;"></div> <script src="{% static 'canvasjs.min.js' %}"></script> </body> </html>
from django.shortcuts import render def index(request): crude_data = [ { "x": 5.3, "y": 16.5, "z": 78.74, "name": "Turkey" }, { "x": 6.4, "y": 13.5, "z": 4.72, "name": "Ireland" }, { "x": 6.4, "y": 11.1, "z": 0.84, "name": "Cyprus" }, { "x": 6.9, "y": 12, "z": 0.33, "name": "Iceland" }, { "x": 7.8, "y": 11.2, "z": 5.2, "name": "Norway" }, { "x": 7.8, "y": 10.5, "z": 8.3, "name": "Switzerland" }, { "x": 8.8, "y": 8.7, "z": 46.44, "name": "Spain" }, { "x": 8.7, "y": 10.1, "z": 16.9, "name": "Netherlands" }, { "x": 8.8, "y": 11.7, "z": 66.75, "name": "France" }, { "x": 9.1, "y": 11.8, "z": 65.3, "name": "United Kingdom" }, { "x": 9.2, "y": 10, "z": 8.69, "name": "Austria" }, { "x": 9.2, "y": 11.8, "z": 9.85, "name": "Sweden" }, { "x": 9.2, "y": 10.8, "z": 5.70, "name": "Denmark" }, { "x": 9.5, "y": 10.8, "z": 11.31, "name": "Belgium" }, { "x": 9.8, "y": 9.6, "z": 5.4, "name": "Finland" }, { "x": 10.2, "y": 10.7, "z": 10.5, "z": "Czech Republic" }, { "x": 10.2, "y": 10.1, "z": 37.96, "name": "Poland" }, { "x": 10.1, "y": 7.8, "z": 60.66, "name": "Italy" }, { "x": 10.7, "y": 8.4, "z": 10.34, "name": "Portugal" }, { "x": 11, "y": 8.6, "z": 10.7, "name": "Greece" }, { "x": 11.2, "y": 9.3, "z": 82.17, "name": "Germany" }, { "x": 12.4, "y": 9, "z": 4.19, "name": "Croatia" }, { "x": 13, "y": 9.7, "z": 9.83, "name": "Hungary" }, { "x": 13, "y": 9.6, "z": 19.76, "name": "Romania" }, { "x": 15.1, "y": 9.1, "z": 7.15, "name": "Bulgaria" } ] return render(request, 'index.html', { "crude_data" : crude_data })
Position of legends can be switched by using horizontalAlign & verticalAlign properties. It can also be positioned inside the plot-area using dockInsidePlotArea property.