Как создавать графики в Vue с помощью Chart.js

В этом руководстве рассмотрим, как создавать графики и диаграммы, которые помогут нам понять данные или информацию во всех смыслах. Покажем вам, как создавать красивые диаграммы в приложении Vue.js 2, используя Chart.js и плагин vue-chartjs.

Наиболее важную информацию можно легко просмотреть с помощью графиков, что невозможно в текстовой форме данных.

Vue.js — это гибкая среда JavaScript для создания полезных пользовательских интерфейсов. Мы воспользуемся помощью Chart.js и vue-chartjs , чтобы реализовать примеры графиков.

Итак, давайте начнем.

Установите плагины Chart.js и vue-chartjs

Запустите команду, чтобы установить плагины vue-chartjs и Chart.js.

npm install vue-chartjs@^4.0.0 chart.js@^3.8.0

Chart.js — это мощная, простая и в то же время гибкая библиотека JavaScript с открытым исходным кодом для разработчиков программного обеспечения. Это помогает создавать различные потрясающие графики с использованием холста HTML5. Это хорошо известная библиотека, и вы можете оценить ее популярность, увидев более 62,1 тыс. звезд на GitHub .

С помощью Chart.js вы можете нарисовать следующие графики:

  • Линия
  • Бар
  • Пончик
  • Пирог
  • Радар
  • Полярная зона
  • Пузырь
  • Разброс

vue-chartjs предоставляет оболочку для Chart.js в Vue. Это позволяет создавать повторно используемые компоненты диаграммы для отображения полезной информации, которую можно легко понять графически.

Создание и настройка компонентов графиков

На этом этапе мы создадим компоненты для примеров графиков.

Затем создайте указанную ниже папку src/Components :

  • LineChart.vue
  • BarChart.vue
  • DoughnutChart.vue
  • PieChart.vue
  • RadarChart.vue
  • PolarAreaChart.vue
  • BubbleChart.vue
  • ScatterChart.vue

Создание и настройка маршрутов в Vue

Сначала вам необходимо установить пакет vue router.

npm add vue-router@^3.1.6

Теперь нам нужно создать и настроить маршруты в нашем приложении Vue. Эти маршруты позволят нам отображать графики из компонента, который мы создали выше.

Откройте файл router/index.js и замените существующий код следующим кодом.

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
  const routes = [
  {
    path: '/',
    name: 'LineChart',
    component: () => import('../components/LineChart.vue')
  },
  {
    path: '/bar',
    name: 'Bar',
    component: () => import('../components/BarChart.vue')
  },
  {
    path: '/doughnut',
    name: 'Doughnut',
    component: () => import('../components/DoughnutChart.vue')
  },
  {
    path: '/pie',
    name: 'Pie',
    component: () => import('../components/PieChart.vue')
  },
  {
    path: '/radar',
    name: 'Radar',
    component: () => import('../components/RadarChart.vue')
  },
  {
    path: '/polar-area',
    name: 'PolarArea',
    component: () => import('../components/PolarAreaChart.vue')
  },
  {
    path: '/bubble',
    name: 'Bubble',
    component: () => import('../components/BubbleChart.vue')
  },
  {
    path: '/scatter',
    name: 'Scatter',
    component: () => import('../components/ScatterChart.vue')
  }
]
const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})
export default router

Теперь вам нужно импортировать и зарегистрировать маршрутизатор в файле main.js.

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
Vue.config.productionTip = false;
new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");

Откройте src/App.vue и замените текущий код заданным кодом.

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Line</router-link> |
      <router-link to="/bar">Bar</router-link> |
      <router-link to="/doughnut">Doughnut</router-link> |
      <router-link to="/pie">Pie</router-link> |
      <router-link to="/radar">Radar</router-link> |
      <router-link to="/polar-area">Polar Area</router-link> |
      <router-link to="/bubble">Bubble</router-link> |
      <router-link to="/scatter">Scatter</router-link>
    </div>
    <div class="container">
      <div class="row">
        <div class="col-12">
          <router-view />
        </div>
      </div>
    </div>
  </div>
</template>
<style lang="scss">
  #app {
    font-family: Avenir, Helvetica, Arial, sans-serif;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-align: center;
    color: #2c3e50;
  }
  #nav {
    padding: 30px 30px 60px;
    a {
      font-weight: bold;
      color: #2c3e50;
      &.router-link-exact-active {
        color: #42b983;
      }
    }
  }
</style>

Мы включили навигацию в Vue, определив router-link внутреннюю часть файла src/App.vue .

Директива <router-view /> отобразит связанное представление для конкретного компонента графика.

Пример линейного графика Vue

Теперь мы создадим линейный график, а также отобразим данные в компоненте Vue с помощью API линейной диаграммы.

Перейдите в components/LineChart.vue и поместите следующий код.

<template>
  <LineChartGenerator :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId"
    :dataset-id-key="datasetIdKey" :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Line as LineChartGenerator } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  LineElement,
  LinearScale,
  CategoryScale,
  PointElement
} from 'chart.js'
ChartJS.register(
  Title,
  Tooltip,
  Legend,
  LineElement,
  LinearScale,
  CategoryScale,
  PointElement
)
export default {
  name: 'LineChart',
  components: {
    LineChartGenerator
  },
  props: {
    chartId: {
      type: String,
      default: 'line-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        labels: ["Babol", "Cabanatuan", "Daegu", "Jerusalem", "Fairfield", "New York", "Gangtok", "Buenos Aires", "Hafar Al-Batin", "Idlib"],
        datasets: [
          {
            label: 'Line Chart',
            data: [600, 1150, 342, 6050, 2522, 3241, 1259, 157, 1545, 9841],
            fill: false,
            borderColor: '#2554FF',
            backgroundColor: '#2554FF',
            borderWidth: 1
          }
        ]
      },
      chartOptions: {
        legend: {
          display: true
        },
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример линейного графика в Vue

Пример гистограммы в Vue

Чтобы создать гистограмму, откройте файл components/BarChart.vue и поместите следующий код.

<template>
  <Bar :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Bar } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  BarElement,
  CategoryScale,
  LinearScale
} from 'chart.js'
ChartJS.register(Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale)
export default {
  name: 'BarChart',
  components: {
    Bar
  },
  props: {
    chartId: {
      type: String,
      default: 'bar-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        labels: ["2015-01", "2015-02", "2015-03", "2015-04", "2015-05", "2015-06", "2015-07", "2015-08", "2015-09",
          "2015-10", "2015-11", "2015-12"
        ],
        datasets: [{
          label: 'Bar Chart',
          borderWidth: 1,
          backgroundColor: [
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)',
            'rgba(75, 192, 192, 0.2)',
            'rgba(153, 102, 255, 0.2)',
            'rgba(255, 159, 64, 0.2)',
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)',
            'rgba(75, 192, 192, 0.2)',
            'rgba(153, 102, 255, 0.2)',
            'rgba(255, 159, 64, 0.2)'
          ],
          borderColor: [
            'rgba(255,99,132,1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)',
            'rgba(75, 192, 192, 1)',
            'rgba(153, 102, 255, 1)',
            'rgba(255, 159, 64, 1)',
            'rgba(255,99,132,1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)',
            'rgba(75, 192, 192, 1)',
            'rgba(153, 102, 255, 1)',
            'rgba(255, 159, 64, 1)'
          ],
          pointBorderColor: '#2554FF',
          data: [12, 19, 3, 5, 2, 3, 20, 3, 5, 6, 2, 1]
        }]
      },
      legend: {
        display: true
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример гистограммы в Vue

Пример кольцевой диаграммы Vue

Чтобы создать кольцевую диаграмму, откройте файл components/DoughnutChart.vue и добавьте следующий код.

<template>
  <Doughnut :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Doughnut } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  ArcElement,
  CategoryScale
} from 'chart.js'
ChartJS.register(Title, Tooltip, Legend, ArcElement, CategoryScale)
export default {
  name: 'DoughnutChart',
  components: {
    Doughnut
  },
  props: {
    chartId: {
      type: String,
      default: 'doughnut-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    }
  },
  data() {
    return {
      chartData: {
        labels: ["Babol", "Cabanatuan", "Daegu", "Jerusalem"],
        datasets: [{
          borderWidth: 1,
          borderColor: [
            'rgba(255,99,132,1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)',
            'rgba(75, 192, 192, 1)'
          ],
          backgroundColor: [
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)',
            'rgba(75, 192, 192, 0.2)',
            'rgba(153, 102, 255, 0.2)',
          ],
          data: [1000, 500, 1500, 1000]
        }]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример кольцевой диаграммы Vue

Пример круговой диаграммы в Vue

Чтобы создать круговую диаграмму, откройте файл components/PieChart.vue и добавьте следующий код.

<template>
  <Pie :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Pie } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  ArcElement,
  CategoryScale
} from 'chart.js'
ChartJS.register(Title, Tooltip, Legend, ArcElement, CategoryScale)
export default {
  name: 'PieChart',
  components: {
    Pie
  },
  props: {
    chartId: {
      type: String,
      default: 'pie-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    }
  },
  data() {
    return {
      chartData: {
        labels: ["Italy", "India", "Japan", "USA",],
        datasets: [{
          borderWidth: 1,
          borderColor: [
            'rgba(255,99,132,1)',
            'rgba(54, 162, 235, 1)',
            'rgba(255, 206, 86, 1)',
            'rgba(75, 192, 192, 1)'
          ],
          backgroundColor: [
            'rgba(255, 99, 132, 0.2)',
            'rgba(54, 162, 235, 0.2)',
            'rgba(255, 206, 86, 0.2)',
            'rgba(75, 192, 192, 0.2)',
          ],
          data: [1000, 500, 1500, 1000]
        }]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример круговой диаграммы в Vue

Пример радиолокационной диаграммы

Чтобы создать радарную диаграмму, откройте файл components/RadarChart.vue и добавьте следующий код.

<template>
  <Radar :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Radar } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  PointElement,
  LineElement,
  RadialLinearScale
} from 'chart.js'
ChartJS.register(
  Title,
  Tooltip,
  Legend,
  PointElement,
  RadialLinearScale,
  LineElement
)
export default {
  name: 'RadarChart',
  components: {
    Radar
  },
  props: {
    chartId: {
      type: String,
      default: 'radar-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        labels: [
          "Babol",
          "Cabanatuan",
          "Daegu",
          "Jerusalem",
          "Fairfield",
          "New York",
          "Gangtok",
          "Buenos Aires",
          "Hafar Al-Batin",
          "Idlib"
        ],
        datasets: [
          {
            label: 'Radar Chart',
            borderWidth: 1,
            backgroundColor: 'rgba(54, 162, 235, 0.2)',
            data: [
              32127289,
              24724027,
              25820412,
              23685667,
              25644258,
              22433220,
              22966210,
              22743184,
              21880515,
              21543111
            ]
          }
        ]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример радиолокационной диаграммы

Пример диаграммы полярной области

Чтобы создать диаграмму полярной области, откройте файл components/PolarAreaChart.vue и добавьте следующий код.

<template>
  <PolarArea :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { PolarArea } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  ArcElement,
  RadialLinearScale
} from 'chart.js'
ChartJS.register(Title, Tooltip, Legend, ArcElement, RadialLinearScale)
export default {
  name: 'PolarAreaChart',
  components: {
    PolarArea
  },
  props: {
    chartId: {
      type: String,
      default: 'polar-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        labels: ['Pink', 'Blue', 'Yellow', 'Green', 'Purple'],
        datasets: [
          {
            label: 'Polar Area Chart',
            borderWidth: 1,
            backgroundColor: [
              'rgba(255, 99, 132, 0.2)',
              'rgba(54, 162, 235, 0.2)',
              'rgba(255, 206, 86, 0.2)',
              'rgba(75, 192, 192, 0.2)',
              'rgba(153, 102, 255, 0.2)',
            ],
            data: [8, 14, 12, 7, 20]
          }
        ]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример диаграммы полярной области

Пример пузырьковой диаграммы

На этом этапе мы создадим диаграмму с пузырьковой областью, поэтому откройте файл components/BubbleChart.vue и добавьте приведенный ниже код.

<template>
  <Bubble :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Bubble } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  PointElement,
  LinearScale
} from 'chart.js'
ChartJS.register(Title, Tooltip, Legend, PointElement, LinearScale)
export default {
  name: 'BubbleChart',
  components: {
    Bubble
  },
  props: {
    chartId: {
      type: String,
      default: 'bubble-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        datasets: [{
          label: 'Population Data',
          borderWidth: 1,
          borderColor: '#2554FF',
          backgroundColor: '#2554FF',
          data: [{
            x: 6,
            y: 3,
            r: 15
          }, {
            x: 3,
            y: 12,
            r: 4
          },
          {
            x: 5,
            y: 15,
            r: 10
          },
          {
            x: 3,
            y: 12,
            r: 8
          },
          {
            x: 4,
            y: 5,
            r: 20
          },
          {
            x: 2,
            y: 6,
            r: 3
          },
          {
            x: 4,
            y: 9,
            r: 11
          },
          {
            x: 5,
            y: 10,
            r: 6
          }
          ]
        }]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример пузырьковой диаграммы

Пример точечной диаграммы

На этом этапе мы создадим диаграмму с пузырьковой областью, поэтому откройте файл components/ScatterChart.vue и добавьте приведенный ниже код.

<template>
  <Scatter :chart-options="chartOptions" :chart-data="chartData" :chart-id="chartId" :dataset-id-key="datasetIdKey"
    :plugins="plugins" :css-classes="cssClasses" :styles="styles" :width="width" :height="height" />
</template>
<script>
import { Scatter } from 'vue-chartjs/legacy'
import {
  Chart as ChartJS,
  Title,
  Tooltip,
  Legend,
  LineElement,
  CategoryScale,
  PointElement,
  LinearScale
} from 'chart.js'
ChartJS.register(
  Title,
  Tooltip,
  Legend,
  LineElement,
  CategoryScale,
  PointElement,
  LinearScale
)
export default {
  name: 'ScatterChart',
  components: {
    Scatter
  },
  props: {
    chartId: {
      type: String,
      default: 'scatter-chart'
    },
    datasetIdKey: {
      type: String,
      default: 'label'
    },
    width: {
      type: Number,
      default: 400
    },
    height: {
      type: Number,
      default: 400
    },
    cssClasses: {
      default: '',
      type: String
    },
    styles: {
      type: Object,
      default: () => { }
    },
    plugins: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      chartData: {
        datasets: [{
          label: 'Population Data',
          borderWidth: 1,
          borderColor: '#2554FF',
          backgroundColor: '#2554FF',
          data: [{
            x: 6,
            y: 3,
            r: 15
          }, {
            x: 3,
            y: 12,
            r: 4
          },
          {
            x: 5,
            y: 15,
            r: 10
          },
          {
            x: 3,
            y: 12,
            r: 8
          },
          {
            x: 4,
            y: 5,
            r: 20
          },
          {
            x: 2,
            y: 6,
            r: 3
          },
          {
            x: 4,
            y: 9,
            r: 11
          },
          {
            x: 5,
            y: 10,
            r: 6
          }
          ]
        }]
      },
      chartOptions: {
        legend: {
          display: true
        },
        responsive: true,
        maintainAspectRatio: false
      }
    }
  }
}
</script>

Пример точечной диаграммы

Вывод

Наконец, мы завершили руководство по диаграммам и графикам Vue. В этом уроке мы научились создавать различные диаграммы и графики и отображать данные в удобной форме. Мы также познакомились с оболочками Vue для Chart js.