trying to use one chart with multiple data sources


Topic: trying to use one chart with multiple data sources

Drew22 asked 5 years ago

Hi! I would love to know if it's possible to swap between more that one js chart or swap what data source it pulls it data from via the tag as i have 3 datatabeles thats im geting my data from each one gose in to the chart but ib been strugling on finding out how to change the data sources and mainly update the chart more dynamicly.
if someone could put a simple example code or point out what documentation i should look at? Thanks!

http://bubble.myddns.me/GroupWork-Site/appCore.php


Grzegorz Bujański staff answered 5 years ago

Hi, did you try use variables to set chart data and switch it using on click event? Something like this:

var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
  type: 'bar',
  data: myData,
  options: { <your options> }
});

firstDataset: { <here you first datasets> }
secondDataset: { <here you second datasets> }

$( "#firstButton" ).on( "click", () => {
  myData = firstDataset;
});
$( "#secondButton" ).on( "click", () => {
  myData = secondDataset;
});

Best, Grzegorz


Drew22 answered 5 years ago

i have the chart working as intended.i want to have 3 php mysql querrys and swap between then data returned by themim assuming ill have to implment ajax to enable something like that or is there a better way to do it?

const ctxL = document.getElementById("lineChart_Year").getContext('2d');
const gradientFill = ctxL.createLinearGradient(0, 0, 0, 350);
gradientFill.addColorStop(0, "rgba(242,38,19,0.5)");
gradientFill.addColorStop(1, "rgba(0,230,64,0.5)");
let LineChartYear = new Chart(ctxL, {
    type: 'line',
    data: {
        labels: <?php echo json_encode($dataLables, JSON_NUMERIC_CHECK); ?>,
        datasets: [{
            label: "Expected Usage",
            data: <?php echo json_encode($dataAvg, JSON_NUMERIC_CHECK); ?>,
            backgroundColor: [
                'rgba(0,0,0,0)',
            ],
            borderColor: [
                'rgba(0, 10, 130, .1)',
            ],
            borderWidth: 2
        },
            {
                label: "Power Used",
                data: <?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>,
                backgroundColor: gradientFill,
                borderColor: gradientFill,
                borderWidth: 2
            }
        ]
    },
    options: {
        responsive: true
    }
});

e


Grzegorz Bujański staff commented 5 years ago

We don't have any recommended way to implement something like this. So if it works - it's a good way.

Best, Grzegorz


Drew22 commented 5 years ago

ok thank you for you time on this issue

glad to know im doing something out of spec for the framework keeps things intresting


Grzegorz Bujański staff commented 5 years ago

No problem. Good luck in implementing more and more interesting solutions

Best, Grzegorz.


Drew22 answered 5 years ago

So iv finaly font time to get it working on our page end comeing up with with a pice of JavaScript to update that data sets.

` Choose time period Year Month Day

                                <script type="text/javascript">
                                    //todo cahe where datas comeing from                                         
                                    //Supplied Datasets to display
                                    //hourly 1 upto 24
                                    let data1 = { "labels": $DataLabelsEncoded,"label": "Expected Usage: ", "datasets": [{ "label": "avg", "data": $dataAvgEncoded, "backgroundColor": "rgba(101, 209, 159, 0.6)", "borderColor": "rgba(101, 209, 159,1)", "borderWidth": 1 },{ "label": "Power usage", "data": $dataPointsEncoded, "backgroundColor": "rgba(93, 176, 201, 0.6)", "borderColor": "rgba(0, 10, 130, .4)", "borderWidth": 1 }] };
                                    //days upto 31 days
                                    let data2 = { "labels": $DataLabelsEncoded,"label": "Expected Usage:", "datasets": [{ "label": "avg", "data": $dataAvgEncoded, "backgroundColor": "rgba(101, 0, 0, 0.6)", "borderColor": "rgba(101, 209, 159,1)", "borderWidth": 1 },{ "label": "Power usage", "data": $dataPointsEncoded, "backgroundColor": "rgba(255, 255, 255, 0.6)", "borderColor": "rgba(0, 10, 130, .4)", "borderWidth": 1 }] };
                                    //months upto 12
                                    let data3 = { "labels": $DataLabelsEncoded,"label": "Expected Usage: ", "datasets": [{ "label": "avg", "data": $dataAvgEncoded, "backgroundColor": "rgba(101, 209, 159, 0.6)", "borderColor": "rgba(101, 209, 159,1)", "borderWidth": 1 },{ "label": "Power usage", "data": $dataPointsEncoded, "backgroundColor": "rgba(93, 176, 201, 0.6)", "borderColor": "rgba(0, 10, 130, .4)", "borderWidth": 1 }] };


                                    // Draw the initial chart
                                    let ctxL = $("#masterLineChart")[0].getContext('2d');
                                        let masterLineChart = new Chart(ctxL, {
                                            type: 'line',
                                            data: data1,
                                            options: {
                                                scales: {
                                                    yAxes: [{
                                                        ticks: {
                                                            beginAtZero: true
                                                        }
                                                    }]
                                                }
                                            }
                                        });

                                // Called on Change
                                $(document).ready(function(){
                                    $("select.dropdown").change(function(){
                                        let selectedChart = $(this).children("option:selected").val();

                                        if (selectedChart ==0){
                                        masterLineChart["config"]["data"] = data1; //<--- THIS WORKS!
                                        masterLineChart.update();
                                        }

                                        if (selectedChart ==1){
                                        masterLineChart["config"]["data"] = data2; //<--- THIS WORKS!
                                        masterLineChart.update();
                                        }

                                        if (selectedChart ==2){

                                        masterLineChart["config"]["data"] = data3; //<--- THIS WORKS!
                                        masterLineChart.update();
                                        }
                                    });
                                });

                            </script>`

if's far from perfect yet but it's functional and can now be improved on.

again thank you for trying to help me with this question.


Grzegorz Bujański staff commented 5 years ago

No problem, Best regards Grzegorz.


Please insert min. 20 characters.

FREE CONSULTATION

Hire our experts to build a dedicated project. We'll analyze your business requirements, for free.

Status

Resolved

Specification of the issue
  • User: Free
  • Premium support: No
  • Technology: MDB jQuery
  • MDB Version: 4.12.0
  • Device: pc / mobile
  • Browser: firefox/chrome
  • OS: windows 10
  • Provided sample code: No
  • Provided link: Yes
Tags