javascript - ChartJs 无法使用此 JSON 对象

标签 javascript jquery angularjs chart.js

我很难让 ChartJS 显示从 Websocket 返回给我的 JSON 对象。我想要它做的就是像普通条形图一样显示在这里。任何帮助将不胜感激。

Json

[
  {
    "title": "Tweets",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Tweets",
        "data": [
          8,
          1,
          2,
          0
        ]
      },
      {
        "name": "Retweets",
        "data": [
          8679,
          4692,
          2105,
          0
        ]
      },
      {
        "name": "Replies",
        "data": [
          3427,
          789,
          1391,
          0
        ]
      },
      {
        "name": "Quotes",
        "data": [
          284,
          66,
          73,
          0
        ]
      },
      {
        "name": "Favorites",
        "data": [
          0,
          0,
          0,
          0
        ]
      }
    ]
  },
  {
    "title": "Tweets",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Tweets",
        "data": [
          8,
          1,
          2,
          0
        ]
      }
    ]
  },
  {
    "title": "Retweets",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Retweets",
        "data": [
          8679,
          4692,
          2105,
          0
        ]
      }
    ]
  },
  {
    "title": "Replies",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Replies",
        "data": [
          3427,
          789,
          1391,
          0
        ]
      }
    ]
  },
  {
    "title": "Quoted Tweets",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Quotes",
        "data": [
          284,
          66,
          73,
          0
        ]
      }
    ]
  },
  {
    "title": "Favorites",
    "y_axis_label": "Number of Tweets",
    "x_axis_labels": [
      "12AM-06AM",
      "06AM-12PM",
      "12PM-06PM",
      "06PM-12AM"
    ],
    "series": [
      {
        "name": "Favorites",
        "data": [
          0,
          0,
          0,
          0
        ]
      }
    ]
  }
]

chartJs.js

function log(message) {
  console.log((message));
}

function buildChart(title, yAxisLabel, xAxisLabels, series){
var timeStamp = json.map(function (item) {
        return item.timestamp;
    });
    var tweet = json.map(function (item) {
        return item.original_tweet;
    });
    var retweet = json.map(function (item) {
        return item.retweet;
    });
    var shared = json.map(function (item) {
        return item.shared;
    });
    var quoted = json.map(function (item) {
        return item.quoted;
    });

    var data = {
        labels: timeStamp,
        datasets: [
            {
                label: timeStamp,
                fillColor: "rgba(0,238,238, 0.8)",
                strokeColor: "rgba(220,220,220,0.8)",
                highlightFill: "rgba(220,220,220,0.75)",
                highlightStroke: "rgba(220,220,220,1)",
                data: tweet
            },
            {
                label: timeStamp,
                fillColor: "rgba(255,153,51, 0.8)",
                strokeColor: "rgba(220,220,220,0.8)",
                highlightFill: "rgba(220,220,220,0.75)",
                highlightStroke: "rgba(220,220,220,1)",
                data: retweet
            },
            {
                label: timeStamp,
                fillColor: "rgba(255,204,0, 0.8)",
                strokeColor: "rgba(220,220,220,0.8)",
                highlightFill: "rgba(220,220,220,0.75)",
                highlightStroke: "rgba(220,220,220,1)",
                data: shared
            },
            {
                label: timeStamp,
                fillColor: "rgba(0,51,255, 0.8)",
                strokeColor: "rgba(220,220,220,0.8)",
                highlightFill: "rgba(220,220,220,0.75)",
                highlightStroke: "rgba(220,220,220,1)",
                data: quoted
            }

        ]
    }};

    var ctx = document.getElementById("myChart").getContext("2d");
    ctx.canvas.width = 1000;
    ctx.canvas.height = 800;
    var myChart = new Chart(ctx).Bar(data, options);

    var options = Chart.defaults.global = {
        responsive: true,
        maintainAspectRatio: true,
        tooltipFillColor: "rgba(0,0,0,0.8)",
        legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"

    };
    var legendHolder = document.createElement('div');
    var formattedDate = new Date();
    document.getElementById("content").innerHTML = formattedDate;

    //document.getElementById('js-legend').innerHTML = myChart.generateLegend();

});

最佳答案

在 HTML 文件中创建一个 canvas 元素。

<canvas id="myChart" width="400" height="400"></canvas>

获取我们要选择的 Canvas 元素的上下文。

var ctx = document.getElementById("myChart").getContext("2d");

将 json 对象的序列化版本分配给变量。

var json = [{"title":"Tweets","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Tweets","data":[8,1,2,0]},{"name":"Retweets","data":[8679,4692,2105,0]},{"name":"Replies","data":[3427,789,1391,0]},{"name":"Quotes","data":[284,66,73,0]},{"name":"Favorites","data":[0,0,0,0]}]},{"title":"Tweets","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Tweets","data":[8,1,2,0]}]},{"title":"Retweets","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Retweets","data":[8679,4692,2105,0]}]},{"title":"Replies","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Replies","data":[3427,789,1391,0]}]},{"title":"Quoted Tweets","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Quotes","data":[284,66,73,0]}]},{"title":"Favorites","y_axis_label":"Number of Tweets","x_axis_labels":["12AM-06AM","06AM-12PM","12PM-06PM","06PM-12AM"],"series":[{"name":"Favorites","data":[0,0,0,0]}]}];

制作数据集数组来显示图表。我现在不自定义颜色,但你可以这样做。

var datasets = [];

正在为基于 0 个索引的数据集生成图表。您可以应用mapper和reducer来聚合json变量。

json[0].series.forEach(function(set){
 datasets.push({label: set.name, data: set.data})
});

为条形图准备数据

var data = {
    labels: json[0]["x_axis_labels"],
    datasets: datasets
};

绘制图表

var myBarChart = new Chart(ctx).Bar(data);

click here to see the live demo

关于javascript - ChartJs 无法使用此 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33024034/

相关文章:

angularjs - Angular-UI 与 Angular-Strap

javascript - 未捕获的类型错误无法读取未定义的视觉 Composer 的属性 'attributes'

javascript - javascript for 循环中的所有 setTimeouts 一次发生

javascript - 用javascript点击链接时如何删除链接属性?

javascript - 在选择菜单中禁用第 n 个子项

带有 Bootstrap 的 jQuery slideToggle

javascript - 赛车状态 : Angular vs Web API & Database

javascript - 谷歌地图标记未显示 API v3

javascript - 使用jquery slider angularjs范围值没有改变

javascript - 内容可编辑区域中的 Angular Directive(指令)