Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use D3 graphic inside popup mapbox?

I am trying to display a D3 graphic inside a popup of mapbox. I am not managing to make it because popup of mapbox is just accepting plain HTML. Is there a way to make it? Like in the following pic where the graphic is inside the popup.

enter image description here

like image 223
Jorge Monroy Avatar asked Sep 17 '25 12:09

Jorge Monroy


1 Answers

The way I was able to make it is using Chart.min.js. and jQuery. enter image description here

Here is a fiddle I have created to show you how to create a popup with a chart.

Relevant code is below. First of all add your links to jquery and chart.js

<!-- jQuery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- ChartJS -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/Chart.min.js"></script>

Then you add a canvas that will be managed by chart.js

        var popup = new mapboxgl.Popup({ closeOnClick: false })
            .setLngLat([-96, 37.8])
            .setHTML('<div class="chart"><canvas id="lineChart" style="min-height: 250px; height: 250px; max-height: 250px; max-width: 100%;"></canvas></div>')
            .addTo(map);

and then add the data sources, options and render the chart in the canvas

   //this is fake data just for testing
   var areaChartData = {
      labels  : ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
      datasets: [
        {
          label               : 'Digital Goods',
          backgroundColor     : 'rgba(60,141,188,0.9)',
          borderColor         : 'rgba(60,141,188,0.8)',
          pointRadius          : false,
          pointColor          : '#3b8bba',
          pointStrokeColor    : 'rgba(60,141,188,1)',
          pointHighlightFill  : '#fff',
          pointHighlightStroke: 'rgba(60,141,188,1)',
          data                : [28, 48, 40, 19, 86, 27, 90]
        },
        {
          label               : 'Electronics',
          backgroundColor     : 'rgba(210, 214, 222, 1)',
          borderColor         : 'rgba(210, 214, 222, 1)',
          pointRadius         : false,
          pointColor          : 'rgba(210, 214, 222, 1)',
          pointStrokeColor    : '#c1c7d1',
          pointHighlightFill  : '#fff',
          pointHighlightStroke: 'rgba(220,220,220,1)',
          data                : [65, 59, 80, 81, 56, 55, 40]
        },
      ]
    }

    //these are the options for testing
    var areaChartOptions = {
      maintainAspectRatio : false,
      responsive : true,
      legend: {
        display: false
      },
      scales: {
        xAxes: [{
          gridLines : {
            display : false,
          }
        }],
        yAxes: [{
          gridLines : {
            display : false,
          }
        }]
      }
    }


    var lineChartCanvas = $('#lineChart').get(0).getContext('2d')
    var lineChartOptions = jQuery.extend(true, {}, areaChartOptions)
    var lineChartData = jQuery.extend(true, {}, areaChartData)
    lineChartData.datasets[0].fill = false;
    lineChartData.datasets[1].fill = false;
    lineChartOptions.datasetFill = false

    var lineChart = new Chart(lineChartCanvas, { 
      type: 'line',
      data: lineChartData, 
      options: lineChartOptions
    })

If this answer solves your issue, please mark it as answer accepted, in that way other users will know it was the right solution.

like image 73
jscastro Avatar answered Sep 19 '25 03:09

jscastro