chart.js中包含来自json的数据的饼图

cnjp1d6j  于 2022-11-06  发布在  Chart.js
关注(0)|答案(1)|浏览(239)

我正在使用数据库中的数据绘制饼图。我的数据库非常简单,但它的结构与我正在检查的所有示例都不同。因此,它看起来像这样:

  1. id | food | tickets
  2. 1 | 300 | 50

我猜id列是不必要的,因为它不会有更多的记录。

数据.php

  1. <?php
  2. //setting header to json
  3. header('Content-Type: application/json');
  4. require_once "../polaczenie.php";
  5. //get connection
  6. $mysqli = @new mysqli($host,$db_user,$db_password,$db_name);
  7. if(!$mysqli){
  8. die("Connection failed: " . $mysqli->error);
  9. }
  10. //query to get data from the table
  11. $query = sprintf("SELECT id,food, tickets FROM arch_kategorie ORDER BY id");
  12. //execute query
  13. $result = $mysqli->query($query);
  14. //loop through the returned data
  15. $data = array();
  16. foreach ($result as $row) {
  17. $data[] = $row;
  18. }
  19. //free memory associated with result
  20. $result->close();
  21. //close connection
  22. $mysqli->close();
  23. //now print the data
  24. print json_encode($data);
  25. ?>

当我通过localhost://data.php检查结果时,我看到了这个:[{“食物”:“300”,“门票”:“50”}]
现在是有问题的部分:

应用程序.php

  1. $(document).ready(function(){
  2. $.ajax({
  3. url : "data.php",
  4. type : "GET",
  5. success : function(data){
  6. console.log(data);
  7. var food= [];
  8. var tickets= [];
  9. for(var i in data) {
  10. food.push(data[i].food);
  11. tickets.push(data[i].tickets);
  12. }
  13. var ctx1 = $("#chartcanvas-1");
  14. var data = {
  15. labels : ["food", "tickets"],
  16. datasets : [{
  17. label : "Result",
  18. data : food, tickets
  19. backgroundColor : [
  20. "#DEB887",
  21. "#A9A9A9"
  22. ],
  23. borderColor : [
  24. "#CDA776",
  25. "#989898"
  26. ],
  27. borderWidth : [1, 1]
  28. }]
  29. };
  30. var options = {
  31. title : {
  32. display : true,
  33. position : "top",
  34. text : "Pie Chart",
  35. fontSize : 18,
  36. fontColor : "#111"
  37. },
  38. legend : {
  39. display : true,
  40. position : "bottom"
  41. }
  42. };
  43. var chart1 = new Chart( ctx1, {
  44. type : "pie",
  45. data : data,
  46. options : options
  47. });
  48. });
  49. },
  50. error : function(data) {
  51. console.log(data);
  52. }
  53. });

当然还有html:

索引.html

  1. <style type="text/css">
  2. #chart-container {
  3. width: 80%;
  4. height: auto;
  5. }
  6. </style>
  7. <div class="chart-container">
  8. <div class="chart-container">
  9. <canvas id="chartcanvas-1"></canvas>
  10. </div>
  11. </div>
2lpgd968

2lpgd9681#

首先,在 AJAX success函数中有变量data的第二个定义。函数参数(parameters)在函数中作为局部变量工作,这与在函数中用关键字let定义它们的方式相同。
第二,datasets中的data必须是number[],而JSON中的值是字符串。
第三,有一点我不清楚,因为在描述数据集时您写道:
我猜id列是不必要的,因为它不会有更多的记录。
但随后您在 AJAX success函数中处理data,因为它是一个多元素对象数组,即使用for循环。因此,这取决于您希望使用哪种类型的数据来实现。一个简单的解决方案,使用SQL表中的一行,Ajax success函数将如下所示:

  1. success: function(data) {
  2. console.log(data);
  3. var ctx1 = $("#chartcanvas-1");
  4. var chartData = {
  5. labels : ["food", "tickets"],
  6. datasets : [{
  7. label : "Result",
  8. data : [Number(data[0].food), Number(data[0].tickets)],
  9. backgroundColor : [
  10. "#DEB887",
  11. "#A9A9A9"
  12. ],
  13. borderColor : [
  14. "#CDA776",
  15. "#989898"
  16. ],
  17. borderWidth : [1, 1]
  18. }]
  19. };
  20. var options = {
  21. title : {
  22. display : true,
  23. position : "top",
  24. text : "Pie Chart",
  25. fontSize : 18,
  26. fontColor : "#111"
  27. },
  28. legend : {
  29. display : true,
  30. position : "bottom"
  31. }
  32. };
  33. var chart1 = new Chart(ctx1, {
  34. type : "pie",
  35. data : chartData,
  36. options : options
  37. });
  38. }

如果从SQL表中提取了多行,则可以将每个数组对象(即包含id字段的SQL行用作label)用作单独的数据集。由于datasets是一个JSON对象数组,因此可以将初始的data转换为以下形式:

  1. success: function(data) {
  2. console.log(data);
  3. var ctx1 = $("#chartcanvas-1");
  4. var datasets = data.map(row => {
  5. let set = {
  6. label: row.id,
  7. data: [Number(row.food), Number(row.tickets)],
  8. backgroundColor: [
  9. "#DEB887",
  10. "#A9A9A9"
  11. ],
  12. borderColor: [
  13. "#CDA776",
  14. "#989898"
  15. ],
  16. borderWidth: [1, 1]
  17. };
  18. return set;
  19. });
  20. console.log(datasets);
  21. var chartData = {
  22. labels : ["food", "tickets"],
  23. datasets : datasets
  24. };
  25. var options = {
  26. title : {
  27. display : true,
  28. position : "top",
  29. text : "Pie Chart",
  30. fontSize : 18,
  31. fontColor : "#111"
  32. },
  33. legend : {
  34. display : true,
  35. position : "bottom"
  36. }
  37. };
  38. var chart1 = new Chart(ctx1, {
  39. type : "pie",
  40. data : chartData,
  41. options : options
  42. });
  43. }
展开查看全部

相关问题