【问题标题】:Create a line chart using an user input table from a data table in chart.js使用来自 chart.js 中数据表的用户输入表创建折线图
【发布时间】:2020-05-13 22:22:13
【问题描述】:

我正在使用用户使用 java 脚本创建的用户输入表在其中添加数据。我从表中获取数据并尝试使用 chartjs 库绘制图表,但无法绘制图表。我尝试了以下方法,但我的第一列表格得到了画布 ID。我有点难过。任何帮助表示赞赏。

 <html>
 <head>
 <title>Index File</title   

</head>
 <body>
<script src="dist/js/chartjs/Chart.min.js"></script>
<div id="POItablediv">
<p>
<input type="button" id="bt" value="Submit Data" onclick="submit()" />
</p>
<input type="button" onclick="insRow()" id="addPOIbutton" value="Add values"/><br/><br/>
<table id="POITable" border="1">
<thead>
    <tr>
        <td>WEEK NO</td>
        <td>alpha</td>
        <td>beta</td>
        <td>Delete?</td>

    </tr>
    </thead>
    <tbody>
    <tr>
        <td>1</td>
        <td><input size=25 type="text" id="latbox"/></td>
        <td><input size=25 type="text" id="lngbox"/></td>
        <td><input type="button" id="delPOIbutton" value="Delete" onclick="deleteRow(this)"/></td>

    </tr>
    <tbody>
</table>
<canvas id="pieChart"></canvas> 

<script type="text/javascript">

    function deleteRow(row)
    {
        var i=row.parentNode.parentNode.rowIndex;
        if(i>1){
        document.getElementById('POITable').deleteRow(i);
        }

    }


    function insRow()
    {

        var x=document.getElementById('POITable');
        var new_row = x.rows[1].cloneNode(true);
        var len = x.rows.length;
        new_row.cells[0].innerHTML = len;

        var inp1 = new_row.cells[1].getElementsByTagName('input')[0];
        inp1.id += len;
        inp1.value = '';
        var inp2 = new_row.cells[2].getElementsByTagName('input')[0];
        inp2.id += len;
        inp2.value = '';
        x.appendChild( new_row );
    }
   function submit() 
   {
     var table = document.getElementById("POITable")
     var tableLen = table.rows.length           
     var data = {labels: [], alpha: [], beta: []
   }

   for (var i = 1; i < tableLen; i++) 
  {
     data.labels.push(table.rows[i].cells[0].innerText)
     data.alpha.push(table.rows[i].cells[1].innerText.replace(',',''))
     data.beta.push(table.rows[i].cells[2].innerText)
  }
    var canvasP = document.getElementById("pieChart")
    var ctxP = canvasP.getContext('2d')
    var myPieChart = new Chart(ctxP, {type: 'line',
    data: 
    { 
        labels: data.labels,
       datasets: [{data: data.alpha,}]
    },
      options: {
      legend: {
      display: true,
      position: "right"
            }
            }
            });
             }

    </script>

【问题讨论】:

    标签: javascript html chart.js


    【解决方案1】:

    我发现获取值的过程存在问题: 您传递给 data.alphadata.beta 的值来自输入,而不是代码显示的 td 元素:

    <td><input size=25 type="text" id="latbox"/></td>
    <td><input size=25 type="text" id="lngbox"/></td>
    

    获取值的模式不适用于输入字段,您必须获取 value 而不是 innerText,就像您在此处所做的那样:

    data.alpha.push(table.rows[i].cells[1].innerText.replace(',',''))
    data.beta.push(table.rows[i].cells[2].innerText)
    

    您应该使用以下方法从输入中获取值:

    data.alpha.push(table.rows[i].cells[1].childNodes[0].value.replace(',',''))
    data.beta.push(table.rows[i].cells[2].childNodes[0].value)
    

    使用childNodes 返回父元素的所有子元素,在这种情况下为td 标签。 childNodes[0] 返回父元素的第一个子元素,即input 标签,然后childNodes[0].value 返回输入字段的值。

    您也可以将其替换为您正在使用的datasets 以获得更友好的输出:

    datasets: [{label: "Pie Chart", data: data.alpha, backgroundColor: "#138bc2", borderColor: "#777777"}]
    

    label 将显示在图表旁边,而不是当前显示的 undefined 值。 backgroundColorborderColor 是不言自明的 ;)

    【讨论】:

    • 如果我想完全基于用户输入的表格,我该如何从中制作图表。以及如何使图表像多个图表一样从 data.alpha 和 data.beta 中获取值。请帮助我。
    • 你的意思是你想要具有多个数据集的堆叠折线图,在这种情况下来自 data.beta 和 data.alpha
    • yup 具有多个数据集的堆叠线图.. 并且还需要帮助以使表格完全基于用户在我的案例周没有太用户定义。我在我的代码中做了哪些更改。请给我这个小提琴。我会非常感谢你。感谢您快速回复我。:)
    • 我为您准备了一支笔供您练习,但这里解释了发生了什么变化。 datasets: [ {label: "Alpha Data", data: data.alpha, backgroundColor: "rgba(255, 34, 123, 0.5)", borderColor: "#777777"}, {label: "Beta Data", data: data.beta, backgroundColor: "rgba(123, 45, 4, 0.5)", borderColor: "#333333"}。如您所见,您可以通过用逗号分隔多条线来将它们添加到折线图中。也尝试试验type: linetype:bar,这也使用相同的数据....Codepen here
    • 嗨@cypherjac ..我只想知道如何将相同的图表呈现到不同的html页面??其次哪个可视化库适合可视化图表??你能给我提供学习java脚本的好资源吗?提前谢谢
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2017-01-06
    • 2016-12-02
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多