javascript - 如何在 chart.js 中创建时间序列折线图?

标签 javascript chart.js

我创建了一个 python 脚本,它从 API 获取数据以获取特定时间的天气温度

结果是一个 CSV 文件,如下所示:

Time,Temperature
2020-02-15 18:37:39,-8.25
2020-02-15 19:07:39,-8.08
2020-02-15 19:37:39,-8.41
2020-02-15 20:07:39,-8.2

如何将 CSV 转换为 JavaScript 数组并从中制作 Chart.js 折线图?

现在,我有一个看起来像这样的 Chart.js 基本脚本(没有填充任何数据)
new Chart(document.getElementById("line-chart"), {
type: 'line',
 data: {
   labels: [],
   datasets: [{ 
       data: [],
       label: "Temperature",
       borderColor: "#3e95cd",
       fill: false
     } 
   ]
 },
 options: {
   scales: {
     xAxes: [{
       type: 'time',
       distribution: 'linear',
     }],
   title: {
     display: false,
   }
   }
 }
});


最佳答案

基本上,转换 每一个文件行字符串 :

2020-02-15 18:37:39,-8.25 

进入 对象 :
{x: "2020-02-15 18:37:39", y: -8.25}

存储在 Chart.js data : [] 中大批。

这是一个关于如何创建函数的示例 csvToChartData()返回这样一个数组(使用如下: ... data: csvToChartData(csv) )
  • trim 和拆分 的文件字符串换行 \n变成 lines大批 。
  • 删除标题 (第一个数组键)使用 lines.shift();
  • 转换每个 到对象的行 {x: date, y: temperature}用逗号分隔每一行 .split(',')
  • 将新映射的数组(通过使用 .map() )作为图表 传递data:


  • const csv = `Time,Temperature
    2020-02-15 18:37:39,-8.25
    2020-02-15 19:07:39,-8.08
    2020-02-15 19:37:39,-8.41
    2020-02-15 20:07:39,-8.2`;
    
    const csvToChartData = csv => {
      const lines = csv.trim().split('\n');
      lines.shift(); // remove titles (first line)
      return lines.map(line => {
        const [date, temperature] = line.split(',');
        return {
          x: date,
          y: temperature
        }
      });
    };
    
    const ctx = document.querySelector("#line-chart").getContext('2d');
    const config = {
      type: 'line',
      data: {
        labels: [],
        datasets: [{
          data: csvToChartData(csv),
          label: "Temperature",
          borderColor: "#3e95cd",
          fill: false
        }]
      },
      options: {
        scales: {
          xAxes: [{
            type: 'time',
            distribution: 'linear',
          }],
          title: {
            display: false,
          }
        }
      }
    };
    new Chart(ctx, config);
    #line-chart {
      display: block;
      width: 100%;
    }
    <canvas id="line-chart"></canvas>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0"></script>


    动态获取数据:

    enter image description here

    要动态获取数据,例如 每 5 秒 ,您可以使用 AJAX 和 Fetch API .
    这是修改后的 JS 示例,因为您有一个名为 temperature.csv 的 CSV 文件

    const config = {
      type: "line",
      data: {
        labels: [],
        datasets: [{
          data: [], // Set initially to empty data
          label: "Temperature",
          borderColor: "#3e95cd",
          fill: false
        }]
      },
      options: {
        scales: {
          xAxes: [{
            type: "time",
            distribution: "linear"
          }],
          title: {
            display: false
          }
        }
      }
    };
    
    const ctx = document.querySelector("#line-chart").getContext("2d");
    const temperatureChart = new Chart(ctx, config);
    
    const csvToChartData = csv => {
      const lines = csv.trim().split("\n");
      lines.shift(); // remove titles (first line)
      return lines.map(line => {
        const [date, temperature] = line.split(",");
        return {
          x: date,
          y: temperature
        };
      });
    };
    
    const fetchCSV = () => fetch("temperature.csv")
      .then(data => data.text())
      .then(csv => {
        temperatureChart.data.datasets[0].data = csvToChartData(csv);
        temperatureChart.update();
        setTimeout(fetchCSV, 5000); // Repeat every 5 sec
      });
    
    fetchCSV(); // First fetch!
    

    关于javascript - 如何在 chart.js 中创建时间序列折线图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244808/

    相关文章:

    javascript - Dygraphs 导出图像 createCanvas 不是函数

    javascript - 如何使用for循环循环遍历元素列表并动态设置元素样式?

    javascript - Chart.js 在线图顶部裁剪

    javascript - 如何对ChartJS气泡图的部分背景进行着色?

    javascript - Chart.js 将折线图向左对齐

    浏览器中的 PHP/JS 文档查看器

    javascript - 单击时自定义绑定(bind)更改样式不起作用

    javascript - 具有按钮状态更改的表单并不总是提交

    javascript - 在 chart.js 条形图上自定义工具提示

    javascript - 在 Chart.js 折线图中显示数据集标签