Статьи

Создание многострочной диаграммы с использованием D3.js

D3.js — это замечательная библиотека JavaScript, которая используется для создания интерактивной и визуально привлекательной графики. D3.js расшифровывается как Data Driven Documents и использует HTML , SVG и CSS для запуска своей магии. Из официальных документов,

D3.js — это библиотека JavaScript для управления документами на основе данных. D3 поможет вам оживить данные, используя HTML, SVG и CSS. Акцент D3 на веб-стандартах дает вам все возможности современных браузеров, не привязывая себя к проприетарной структуре, сочетая мощные компоненты визуализации и управляемый данными подход к манипулированию DOM.

Этот урок будет вводным уроком по D3.js, где мы сосредоточимся на некоторых основных вещах для создания динамического графа. В ходе этого урока мы увидим, как создать многострочный график с использованием библиотеки D3.js.

Если вы ищете быстрое решение, на Envato Market есть выбор элементов графика JavaScript .

Начиная с нескольких долларов, это отличный способ реализовать что-то за несколько минут, а создание с нуля займет гораздо больше времени!

Вы можете найти сценарии для создания всего, от простых линейных диаграмм до сложной инфографики.

Элементы диаграммы JavaScript на рынке Envato
Элементы диаграммы JavaScript на рынке Envato

Чтобы начать работать с D3.js , загрузите и включите D3.js, или вы можете напрямую ссылаться на последнюю версию D3.js.

1
<script src=»http://d3js.org/d3.v3.min.js» charset=»utf-8″></script>

Мы начнем с создания осей X и Y для нашего графика. Мы будем использовать некоторые данные для построения графика.

Вот основной голый HMTL-код index.html :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html lang=»en»>
 
<head>
 
    <link href=»http://getbootstrap.com/dist/css/bootstrap.min.css» rel=»stylesheet»>
 
    <link href=»http://getbootstrap.com/examples/justified-nav/justified-nav.css» rel=»stylesheet»>
 
    <script src=»http://d3js.org/d3.v3.min.js» charset=»utf-8″></script>
 
</head>
 
<body>
 
    <div class=»container»>
 
        <div class=»jumbotron»>
 
        </div>
 
    </div>
 
</body>
 
</html>

Для начала нам понадобятся примеры данных. Вот наши примеры данных:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
var data = [{
    «sale»: «202»,
    «year»: «2000»
}, {
    «sale»: «215»,
    «year»: «2001»
}, {
    «sale»: «179»,
    «year»: «2002»
}, {
    «sale»: «199»,
    «year»: «2003»
}, {
    «sale»: «134»,
    «year»: «2003»
}, {
    «sale»: «176»,
    «year»: «2010»
}];

Масштабируемая векторная графика (SVG) — это формат изображения на основе XML для рисования 2D-графики, который поддерживает интерактивность и анимацию. Мы будем использовать элемент svg чтобы нарисовать наш график. Добавьте элемент svg в index.html :

1
<svg id=»visualisation» width=»1000″ height=»500″></svg>

Далее, давайте определим некоторые константы, такие как width , height , left margin и т. Д., Которые мы будем использовать при создании графика. D3 предоставляет метод d3.select для выбора элемента. Мы будем использовать d3.select, чтобы выбрать элемент svg из index.html .

1
2
3
4
5
6
7
8
9
var vis = d3.select(«#visualisation»),
   WIDTH = 1000,
   HEIGHT = 500,
   MARGINS = {
       top: 20,
       right: 20,
       bottom: 20,
       left: 50
   },

На основе данных нам нужно создать шкалы для осей X и Y. Нам потребуется максимальное и минимальное значение доступных данных для создания шкал на осях. D3 предоставляет метод API с именем d3.scale.linear, который мы будем использовать для создания шкал для осей.

d3.scale.linear использует два свойства, называемые range и domain для создания масштаба. Range определяет область, доступную для визуализации графика, а Domain определяет максимальное и минимальное значения, которые мы должны отобразить в доступном пространстве.

1
xScale = d3.scale.linear().range([MARGINS.left, WIDTH — MARGINS.right]).domain([2000,2010]),

Range был указан в приведенном выше коде, чтобы он не был переполнен по краям. Максимальные и минимальные значения для домена были установлены на основе использованных образцов данных.

Аналогично, определите yScale как показано:

1
yScale = d3.scale.linear().range([HEIGHT — MARGINS.top, MARGINS.bottom]).domain([134,215]),

Далее, давайте создадим оси, используя шкалы, определенные в приведенном выше коде. D3 предоставляет метод API под названием d3.svg.axis для создания осей.

1
2
3
4
5
xAxis = d3.svg.axis()
    .scale(xScale),
  
yAxis = d3.svg.axis()
    .scale(yScale);

Затем добавьте созданную ось X к контейнеру svg как показано:

1
2
vis.append(«svg:g»)
   .call(xAxis);

Сохраните изменения и попробуйте просмотреть index.html . Вы должны иметь что-то вроде:

Ось X

Как видите, ось X нарисована, но у нее есть некоторые проблемы. Во-первых, нам нужно расположить его вертикально вниз. Добавляя ось X к контейнеру SVG, мы можем использовать свойство transform для перемещения оси вниз. Мы будем использовать translate transform для перемещения оси на основе координат. Поскольку нам нужно переместить ось X только вниз, мы предоставим координаты преобразования для оси X как 0, а ось Y чуть выше поля.

1
2
3
vis.append(«svg:g»)
   .attr(«transform», «translate(0,» + (HEIGHT — MARGINS.bottom) + «)»)
   .call(xAxis);

Теперь давайте добавим ось Y. Добавьте следующий код, чтобы добавить ось Y в контейнер SVG:

1
2
vis.append(«svg:g»)
   .call(yAxis);

Сохраните изменения и просмотрите index.html и у вас должны быть обе оси, как показано.

Оси X и Y на графике

Как вы можете видеть на снимке экрана выше, Y axis не в правильном положении. Итак, нам нужно изменить orientation показанной выше оси Y влево. Как только ось будет выровнена по левой стороне, мы применим преобразование D3, чтобы правильно разместить его вдоль оси X. Добавьте свойство orient в yAxis чтобы изменить его ориентацию.

1
2
3
yAxis = d3.svg.axis()
   .scale(yScale)
   .orient(«left»);

Примените transform D3, пытаясь добавить Y axis к контейнеру SVG:

1
2
3
vis.append(«svg:g»)
   .attr(«transform», «translate(» + (MARGINS.left) + «,0)»)
   .call(yAxis);

Мы сохранили координату y перевода как 0, так как мы хотели только переместить ее горизонтально. Сохраните изменения и просмотрите index.html . Вы должны увидеть что-то вроде:

Ось X и Y

Чтобы yScale пример данных на нашей диаграмме, нам нужно применить xScale и yScale к координатам, чтобы преобразовать их и нарисовать линию в пространстве графика. D3 предоставляет метод API под названием d3.svg.line() для рисования линии. Поэтому добавьте следующий код:

1
2
3
4
5
6
7
var lineGen = d3.svg.line()
 .x(function(d) {
   return xScale(d.year);
 })
 .y(function(d) {
   return yScale(d.sale);
 });

Как вы можете видеть в приведенном выше коде, мы указали координаты x и y для линии в соответствии с yScale определенными xScale и yScale .

Далее мы добавим путь к строке в svg и отобразим пример данных в графическое пространство с lineGen функции lineGen . Мы также определим несколько атрибутов для линии, таких как цвет stroke-width и т. Д., Как показано ниже:

1
2
3
4
5
vis.append(‘svg:path’)
 .attr(‘d’, lineGen(data))
 .attr(‘stroke’, ‘green’)
 .attr(‘stroke-width’, 2)
 .attr(‘fill’, ‘none’);

Сохраните изменения и просмотрите index.html . Вы должны иметь линейный график, как показано:

Однолинейный график

По умолчанию линия будет иметь linear interpolation . Мы можем указать интерполяцию, а также добавить немного CSS к осям, чтобы он выглядел лучше.

1
2
3
4
5
6
7
8
var lineGen = d3.svg.line()
   .x(function(d) {
       return xScale(d.year);
   })
   .y(function(d) {
       return yScale(d.sale);
   })
   .interpolate(«basis»);

Добавьте следующий CSS в index.html :

1
2
3
4
5
6
7
8
9
.axis path {
    fill: none;
    stroke: #777;
    shape-rendering: crispEdges;
}
.axis text {
    font-family: Lato;
    font-size: 13px;
}

Включите класс в xAxis и yAxis :

1
2
3
4
5
6
7
8
9
vis.append(«svg:g»)
    .attr(«class»,»axis»)
    .attr(«transform», «translate(0,» + (HEIGHT — MARGINS.bottom) + «)»)
    .call(xAxis);
 
vis.append(«svg:g»)
    .attr(«class»,»axis»)
    .attr(«transform», «translate(» + (MARGINS.left) + «,0)»)
    .call(yAxis);

С интерполяцией basis и некоторым CSS, вот как это должно выглядеть:

Линейная диаграмма с базисной интерполяцией

Рассмотрим другой пример набора данных, как показано:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
var data2 = [{
    «sale»: «152»,
    «year»: «2000»
}, {
    «sale»: «189»,
    «year»: «2002»
}, {
    «sale»: «179»,
    «year»: «2004»
}, {
    «sale»: «199»,
    «year»: «2006»
}, {
    «sale»: «134»,
    «year»: «2008»
}, {
    «sale»: «176»,
    «year»: «2010»
}];

Для простоты мы рассмотрели два разных образца данных с одинаковыми значениями X axis Чтобы data2 показанные data2 data data2 вместе с data , нам просто нужно добавить еще один путь svg элементу svg . Единственное отличие состоит в том, что данные, передаваемые для масштабирования в функцию data2 — это data2 . Вот как это должно выглядеть:

1
2
3
4
5
vis.append(‘svg:path’)
 .attr(‘d’, lineGen(data2))
 .attr(‘stroke’, ‘blue’)
 .attr(‘stroke-width’, 2)
 .attr(‘fill’, ‘none’);

Сохраните изменения и просмотрите index.html . Вы должны увидеть многострочный график, как показано на рисунке:

Многострочный график

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

Исходный код из этого урока доступен на GitHub .

Дайте нам знать ваши мысли в комментариях ниже!