【问题标题】:Chart.js - Multiple Line Charts - Only Show Last ChartChart.js - 多个折线图 - 仅显示最后一个图表
【发布时间】:2014-07-10 09:59:41
【问题描述】:

我正在使用 chart.js 在一页上显示多个折线图。但是,即使我称它们为#canvas1 和#canvas2,也只有最后一个图表显示。某些地方一定有冲突,我已经尝试了大多数事情,但没有任何快乐。这里有两张图表,它只显示最后一张:

图一

<script type="text/javascript">

    var lineChartData = {
        labels : ["January","February","March","April","May","June","July","August","September","October","November","December"],
        datasets : [
            {
                label: "Target",
                fillColor : "rgba(220,220,220,0.2)",
                strokeColor : "rgba(220,220,220,1)",
                pointColor : "rgba(220,220,220,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(220,220,220,1)",
                data : [160000,175000,185000,180000,185000,185000,185000,195000,200000,0,0]
            },
            {
                label: "Sales",
                fillColor : "rgba(151,187,205,0.2)",
                strokeColor : "rgba(151,187,205,1)",
                pointColor : "rgba(151,187,205,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(151,187,205,1)",
                data : [<?php echo $stockJanuary ?>,<?php echo $stockFebruary ?>,<?php echo $stockMarch ?>,<?php echo $stockApril ?>,<?php echo $stockMay ?>,<?php echo $stockJune ?>,<?php echo $stockJuly ?>,<?php echo $stockAugust ?>,<?php echo $stockSeptember ?>,<?php echo $stockOctober ?>,<?php echo $stockNovember ?>,<?php echo $stockDecember ?>]
            }
        ]

    }
            window.onload = function(){
    var ctx = document.getElementById("canvas1").getContext("2d");
    window.myLine = new Chart(ctx).Line(lineChartData, {
        responsive: true
    });
}
</script>

图二:

<script type="text/javascript">

    var lineChartData = {
        labels : ["January","February","March","April","May","June","July","August","September","October","November","December"],
        datasets : [
            {
                label: "Target",
                fillColor : "rgba(220,220,220,0.2)",
                strokeColor : "rgba(220,220,220,1)",
                pointColor : "rgba(220,220,220,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(220,220,220,1)",
                data : [19000,21000,23000,25000,27000,29000,31000,32000,33000,0,0]
            },
            {
                label: "Sales",
                fillColor : "rgba(151,187,205,0.2)",
                strokeColor : "rgba(151,187,205,1)",
                pointColor : "rgba(151,187,205,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(151,187,205,1)",
                data : [<?php echo $northJanuary ?>,<?php echo $northFebruary ?>,<?php echo $northMarch ?>,<?php echo $northApril ?>,<?php echo $northMay ?>,<?php echo $northJune ?>,<?php echo $northJuly ?>,<?php echo $northAugust ?>,<?php echo $northSeptember ?>,<?php echo $northOctober ?>,<?php echo $northNovember ?>,<?php echo $northDecember ?>]
            }
        ]

    }

    window.onload = function(){
    var ctx = document.getElementById("canvas2").getContext("2d");
    window.myLine = new Chart(ctx).Line(lineChartData, {
    responsive: true
    });



}

</script>

非常感谢您的帮助,这已经困扰我一段时间了!

提前致谢

【问题讨论】:

    标签: javascript charts


    【解决方案1】:

    尝试为两个 ctx 变量使用不同的名称。

    window.onload = function(){
        var ctx = document.getElementById("canvas2").getContext("2d");
        window.myLine = new Chart(ctx).Line(lineChartData, {
            responsive: true
        });
    
    
        var ctx2 = document.getElementById("canvas1").getContext("2d");
        window.myLine = new Chart(ctx2).Line(lineChartData2, {
            responsive: true
        });   
    }
    

    【讨论】:

    • 这是我在看到这个之前得到的。它正在加载最后一个
    • 有没有办法动态地做到这一点我的意思是通过创建一个 ctx 来填充画布我需要在一个页面中创建 9 个图表,一个一个地声明和填充 ctx 非常冗长
    【解决方案2】:

    最初我遇到了与原始问题完全相同的问题,并尝试了 Arpan Das 的建议,但在第一次尝试时没有得到正确的结果。

    其他有同样问题的人,可能会发现看看这个在一个页面上显示多个图表的工作示例很有用:

    <div id="canvas-holder">
    <canvas id="A" width="300" height="300"/><br>
    </div>
    
    <div id="canvas-holder">
    <canvas id="B" width="300" height="300"/><br>
    </div>
    
    <script>
        var pieDataA = [ { value: 50, color: "#F6BFBD" } ];
        var pieDataB = [ { value: 50, color: "#00BFBD" } ];
        window.onload = function(){
        var ctx1 = document.getElementById("A").getContext("2d");
        window.myPieA = new Chart(ctx1).Pie(pieDataA); 
    
        var ctx2 = document.getElementById("B").getContext("2d");
        window.myPieB = new Chart(ctx2).Pie(pieDataB); };
    </script>
    

    Fiddle link: http://fiddle.jshell.net/2omjx9dn/

    【讨论】:

    • 这不是一个答案,而是一个问题,请打开一个新问题
    • @wanos,所以这段代码解决了问题吧?你能更详细地解释一下吗?我认为你让人们感到困惑。
    • 道歉,认为“工作示例”简洁而充分
    【解决方案3】:

    初始代码中的错误是你多次调用函数window.onload

    不幸的是,事情没那么简单。当执行第二个 onload 事件处理程序时,第一个 onload 事件处理程序将被替换。 [直到最后一个 onload.window]

    当您想要单独创建图表时通常会出现该问题,例如,在页面图表中包含 php(因为在每个 php 页面中您都在调用 window.onload)

    简单的解决方案:

    function start() {
      func1();
      func2();
    }
    window.onload = start;
    

    西蒙·威利森提议:

    function addLoadEvent(func) {
      var oldonload = window.onload;
      if (typeof window.onload != 'function') {
        window.onload = func;
      } else {
        window.onload = function() {
          if (oldonload) {
            oldonload();
          }
          func();
        }
      }
    }
    addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
    addLoadEvent(function() {
      /* more code to run on page load */
    });
    

    【讨论】:

    • 欢迎来到Stack Overflow!也许我遗漏了一些东西,但有什么理由你不能只使用window.addEventListener('load', fn);?据我所知,这允许多个回调。
    【解决方案4】:

    使用chart.js的多折线图

     <script type="text/javascript">
                $(document).ready(function () {
                    debugger;
                    $.ajax({
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        url: "CampComparison.aspx/getLineChartDataload",
                        data:{},
                        async: true,
                        cache: false,
                        dataType: "json",
                        success: OnSuccess_,
                        error: OnErrorCall_
                    })
    
                    function OnSuccess_(reponse) {
    
                        var aData = reponse.d;
                        var aLabels = aData[0];
                        var aDatasets1 = aData[1];
                        var aDatasets2 = aData[2];
                        var aDatasets3 = aData[3];
                        var aDatasets4 = aData[4];
                        var aDatasets5 = aData[5];
    
                        var lineChartData = {
                            labels: aLabels,
                            datasets: [
                                {
                                    label: "Data1",
                                    //fill:false,
                                    fillColor: "rgba(0,0,0,0)",
                                    strokeColor: "rgba(220,220,220,1)",
                                    pointColor: "rgba(200,122,20,1)",
    
                                    data: aDatasets1
                                },
                                {
                                    label: "Data2",
                                    fillColor: 'rgba(0,0,0,0)',
                                    strokeColor: 'rgba(220,180,0,1)',
                                    pointColor: 'rgba(220,180,0,1)',
                                    data: aDatasets2
                                },
                                {
    
                                    label: "Data5",
                                    fillColor: "rgba(0,0,0,0)",
                                    strokeColor: "rgba(151,187,205,1)",
                                    pointColor: "rgba(152,188,204,1)",
                                    data: aDatasets3
                                },
    
                                {
                                    label: "Data4",
                                    fillColor: 'rgba(0,0,0,0)',
                                    strokeColor: 'rgba(151,187,205,1)',
                                    pointColor: 'rgba(151,187,205,1)',
                                    data: aDatasets4
                                },
                                {
                                    label: "Data4",
                                    fillColor: 'rgba(0,0,0,0)',
                                    strokeColor: 'rgba(151,187,205,1)',
                                    pointColor: 'rgba(151,187,205,1)',
    
                                    data: aDatasets5
                                },
    
    
                            ]
                        }
                        Chart.defaults.global.animationSteps = 50;
                        Chart.defaults.global.tooltipYPadding = 16;
                        Chart.defaults.global.tooltipCornerRadius = 0;
                        Chart.defaults.global.tooltipTitleFontStyle = "normal";
                        Chart.defaults.global.tooltipFillColor = "rgba(0,160,0,0.8)";
                        Chart.defaults.global.animationEasing = "easeOutBounce";
                        Chart.defaults.global.responsive = true;
                        Chart.defaults.global.scaleLineColor = "black";
                        Chart.defaults.global.scaleFontSize = 16;
                        //lineChart.destroy();
                        //document.getElementById("canvas").innerHTML = '&nbsp;';
                        //document.getElementById("chartContainer").innerHTML = '&nbsp;';
                        //document.getElementById("chartContainer").innerHTML = '<canvas id="canvas" style="width: 650px; height: 350px;"></canvas>';
                       //var ctx = document.getElementById("canvas").getContext("2d");
                        //ctx.innerHTML = "";
                        //var pieChartContent = document.getElementById('pieChartContent');
                        //pieChartContent.innerHTML = '&nbsp;';
                        //$('#pieChartContent').append('<canvas id="canvas" width="650px" height="350px"><canvas>');
    
                        //ctx = $("#canvas").get(0).getContext("2d");
                       var ctx = document.getElementById("canvas").getContext("2d");
                        var lineChart = new Chart(ctx).Line(lineChartData, {
    
                            bezierCurve: true,
                            chartArea: { width: '62%' },
                            responsive: true,
                            pointDotRadius: 10,
                            scaleShowVerticalLines: false,
                            scaleGridLineColor: 'black'
    
    
                        });
                    }
                    function OnErrorCall_(repo) {
                        //alert(repo);
                    }
                });
    
                //});
    
                 </script>
    C#code
    --------
        [WebMethod(EnableSession = true)]
            public static List<object> getLineChartDataload()
            {
                List<object> iData = new List<object>();
                List<string> labels = new List<string>();
                string advertiserid = HttpContext.Current.Session["AccountID"].ToString();
                if (!string.IsNullOrEmpty(advertiserid))
                {
                   // string StartDate = DateTime.Now.AddDays(-180).ToString("yyyy-MM-dd");
                    string StartDate = DateTime.Now.AddDays(-60).ToString("yyyy-MM-dd");
                    string EndDate = DateTime.Now.ToString("yyyy-MM-dd");
                    string strcampaignid = string.Empty;
                    DataTable dt = new DataTable();
                    int i = 0;
                    chatBL objcampid = new chatBL();
                    string query = "select distinct top 3 Campaignid,CampaignName from campaign where advertiserid='" + advertiserid + "' order by CampaignName";
                    dt = objcampid.commonFuntionGetData2(query);
                    foreach (DataRow drow in dt.Rows)
                    {
                        strcampaignid += drow["Campaignid"].ToString() + ",";
                    }
                    if (!string.IsNullOrEmpty(strcampaignid))
                    {
                        strcampaignid = strcampaignid.Substring(0, strcampaignid.Length - 1);
                    }
                    string[] campaignid = strcampaignid.Split(',');
    
    
                    //First get distinct Month Name for select Year.
                    // string query1 = "select top 10 cast(createddatetime as date) as month_name from advertiser where CurrentBal>0 order by CurrentBal";
                    //query1 += " ";
                    // query1 += " order by month_number;";
                    foreach (string strcamp in campaignid)
                    {
    
                        if (i == 0)
                        {
                            chatBL objblabel = new chatBL();
                            // DataTable dtLabels = objblabel.Topupmonthly("5E8EF1E9-67BF-489C-84CB-AFF0BB0FE707", "2015-09-18", "2016-02-25", "months");
                            DataTable dtLabels = objblabel.Topupmonthly2(strcamp, StartDate, EndDate, "months");
                            foreach (DataRow drow in dtLabels.Rows)
                            {
                                labels.Add(drow["InsDateTime"].ToString().Substring(2, 7));
                            }
                            iData.Add(labels);
                        }
    
    
                        // string query_DataSet_1 = "select top 10 CurrentBal from advertiser where CurrentBal>0 order by CurrentBal";
                        //query_DataSet_1 += " (orders_quantity) as total_quantity  from mobile_sales  ";
                        //query_DataSet_1 += " where YEAR(orders_date)='" + year + "' and  mobile_id='" + mobileId_one + "'  ";
                        //query_DataSet_1 += " group by   month(orders_date) ";
                        //query_DataSet_1 += " order by  month_number  ";
    
    
                        chatBL objbl = new chatBL();
                        DataTable dtDataItemsSets_1 = objbl.Topupmonthly2(strcamp, StartDate, EndDate, "months");
                        List<double> lst_dataItem_1 = new List<double>();
                        foreach (DataRow dr in dtDataItemsSets_1.Rows)
                        {
                            lst_dataItem_1.Add(Convert.ToDouble(dr["CPACOUNT"].ToString()));
                        }
                        iData.Add(lst_dataItem_1);
    
                        //string query_DataSet_2 = "select top 10 Totalspent from advertiser where CurrentBal>0 order by CurrentBal";
                        //query_DataSet_2 += " (orders_quantity) as total_quantity  from mobile_sales  ";
                        //query_DataSet_2 += " where YEAR(orders_date)='" + year + "' and  mobile_id='" + mobileId_two + "'  ";
                        //query_DataSet_2 += " group by   month(orders_date) ";
                        //query_DataSet_2 += " order by  month_number  ";
    
                        //chatBL objbl1 = new chatBL();
                        //DataTable dtDataItemsSets_2 = objbl1.Topupmonthly("5E8EF1E9-67BF-489C-84CB-AFF0BB0FE707", "2015-09-18", "2016-02-25", "months");
                        //List<double> lst_dataItem_2 = new List<double>();
                        //foreach (DataRow dr in dtDataItemsSets_2.Rows)
                        //{
                        //    lst_dataItem_2.Add(Convert.ToDouble(dr["CPACOUNT"].ToString()));
                        //}
                        //iData.Add(lst_dataItem_2);
                        i = i + 1;
                    }
                }
                return iData;
            }        
    

    【讨论】:

    • 发布代码没有太多解释并没有真正的帮助。另外,这里的OP是专门询问在同一页面上使用多个图表时出现的问题,而不是单个图表。
    【解决方案5】:

    我也遇到了同样的问题,虽然这只是我个人的一点关注,但我花了一段时间才弄清楚:我对所有变化很小的图表都使用了相同的数据参考。

    这是问题和解决方案:

    chartData = {
            labels: Array(dataLeft.length).fill(""), // No labels on X axis
            datasets: [
                {
                    label                     : "Lado Esquerdo",
                    backgroundColor           : "rgba(50,192,50,0.4)",
                    borderColor               : "rgba(75,192,75,1)",
                    pointBorderColor          : "rgba(75,192,75,1)",
                    data                      : dataLeft,
                },
                {
                    label                      : "Lado Direito",
                    backgroundColor            : "rgba(192,50,50,0.4)",
                    borderColor                : "rgba(192,75,75,1)",
                    pointBorderColor           : "rgba(192,75,75,1)",
                    data                       : dataRight,
                }
            ]
        };
    

    我对所有图表都使用了这个chartData,但在构建新图表之前,我正在更改数据属性 (chartData.datasets[0].data = some_specific_value_for_each_chart)

    但由于这是一个参考,我正在更改所有先前构建的图表的数据,将它们的数据设置为与上次初始化的图表相同的数据!


    我不知道我是否采取了最好的方法,但为了解决这个问题,我在初始化图表时动态返回了数据

    createChartData = function(dataRight, dataLeft) {
        return {
                labels: Array(dataLeft.length).fill(""), // No labels on X axis
                datasets: [
                    {
                        label                     : "Lado Esquerdo",
                        backgroundColor           : "rgba(50,192,50,0.4)",
                        borderColor               : "rgba(75,192,75,1)",
                        pointBorderColor          : "rgba(75,192,75,1)",
                        data                      : dataLeft,
                    },
                    {
                        label                      : "Lado Direito",
                        backgroundColor            : "rgba(192,50,50,0.4)",
                        borderColor                : "rgba(192,75,75,1)",
                        pointBorderColor           : "rgba(192,75,75,1)",
                        data                       : dataRight,
                    }
                ]
            }
    };
    

    然后初始化图表:

    var chart1 = new Chart(ctx1, {
                type: 'line',
                data: createChartData(graphData1, graphData2),
                options: chartOptions
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多