Π Π°Π·Π½ΠΎΠ΅

D3 js ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΎ D3.js / Π₯Π°Π±Ρ€

09.11.2020

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² D3 / Π₯Π°Π±Ρ€


D3.js (ΠΈΠ»ΠΈ просто D3) это JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Она прСдоставляСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ массивов Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ создания DOM-элСмСнтов. Π­Ρ‚Π° Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ° описываСт Ρ€Π°Π±ΠΎΡ‚Ρƒ с основными ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠ½Π° ΠΏΠΎΠ΄ΠΎΠΉΠ΄Ρ‘Ρ‚ для изучСния основ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ погруТСния Π² Π΅Ρ‘ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ возмоТности.

Для понимания ΡΡ‚Π°Ρ‚ΡŒΠΈ пригодятся знания JS, HTML ΠΈ CSS.



Π’Π΅ΠΊΡƒΡ‡ΠΈΠΉ интСрфСйс (fluent interface)

D3 Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ fluent interface. ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΎΠ½ выглядит ΠΊΠ°ΠΊ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ» ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π±Ρ‹Π»ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² располагаСтся Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строчкС:

d3.select('body') // Π²Ρ‹Π±ΠΎΡ€ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ body
    .append('svg') // Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² body svg-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°
    .append('text') // Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² svg-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ элСмСнта text
    .text('Click somewhere, please...') // ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ тСкста Π² элСмСнтС text
    . attr('x', 50) // Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ элСмСнта text
    .attr('y', 50)
    .style("fill","firebrick") // Π·Π°Π»ΠΈΠ²ΠΊΠ° тСкста Ρ†Π²Π΅Ρ‚ΠΎΠΌ

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° jsfiddle.net

Π’Ρ‹Π±ΠΎΡ€ΠΊΠ°

Π’ D3, ΠΊΠ°ΠΊ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… JS-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… с DOM-элСмСнтами, взаимодСйствиС с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ начинаСтся с поиска элСмСнтов Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΈ создания Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ β€” ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΈ Π½Π°Π±ΠΎΡ€Π° элСмСнтов. Она Π΄Π°Ρ‘Ρ‚ доступ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… элСмСнтов.

Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° (selection) Π² D3 создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² d3.select() ΠΈ d3.selectAll(). Для создания Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ D3 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ querySelector/querySelectorAll ΠΈΠ»ΠΈ Sizzle, Ссли ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½ ΠΊ страницС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с jQuery).

d3.select('span') // Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ span Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅
d3.selectAll('span') // Π²Ρ‹Π±ΠΎΡ€ всСх span Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с элСмСнтами ΠΈ для создания Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² (subselection).

<span>Π±ΡƒΠ΄Π΅Ρ‚ Π·Π΅Π»Π΅Π½Ρ‹ΠΌ</span>
<p>
    <span>Π±ΡƒΠ΄Π΅Ρ‚ красным</span>
    <span>эти</span>
    <span>Π±ΡƒΠ΄ΡƒΡ‚</span>
    <span>ΠΆΡ‘Π»Ρ‚Ρ‹ΠΌΠΈ</span>
</p>
<p>останСтся Ρ‡Ρ‘Ρ€Π½Ρ‹ΠΌ</p>
d3. select('span')                  // Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ span Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅
    .style('color', 'darkgreen') // установка Ρ†Π²Π΅Ρ‚Π°
d3.selectAll('p')                   // Π²Ρ‹Π±ΠΎΡ€ всСх ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ΠΎΠ²
    .selectAll('span')             // Π²Ρ‹Π±ΠΎΡ€ всСх span Π² этих ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π°Ρ….
    .style('color', 'goldenrod') // установка Ρ†Π²Π΅Ρ‚Π°
d3.select('p')                      // Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π° Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅
    .select('span')                // Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ span Π² этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅
    .style('color', 'firebrick')  // установка Ρ†Π²Π΅Ρ‚Π°

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° jsfiddle.net

ВсСгда ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, с ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ Π²Ρ‹ сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅. РаспространённыС ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с D3: Π²Ρ‹Π·ΠΎΠ² Π½Π° элСмСнтС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ вмСсто родитСля ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° измСнСния свойств Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ (ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π΅Ρ‰Ρ‘ Π½Π΅ созданного) элСмСнта.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ элСмСнтами (selection.style(name[, value])), дальшС рассмотрим ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

ВычислСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Ρ‹

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с DOM D3 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ схоТий API для всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π΅Π³ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ популярной Π·Π°Π΄Π°Ρ‡ΠΈ: добавлСния ΠΈΠ»ΠΈ удалСния класса Ρƒ элСмСнта. Для этого Π½Π°ΠΌ понадобятся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΊ:

  • selection.classed(name, value) добавляСт ΠΈΠ»ΠΈ удаляСт класс name Π² зависимости ΠΎΡ‚ Π±ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния value.
  • selection.on(event, callback) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий, пСрСдавая Π½Π°Π·Π²Π°Π½ΠΈΠ΅ события event (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«clickΒ») ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ callback. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ элСмСнтом Π² this, Π° Ρ‚Π°ΠΊΠΆΠ΅ data ΠΈ index Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ…. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ d3.event. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½Π°Ρ установка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ.
var pressed = false
var button = d3.select('button')     // Π²Ρ‹Π±ΠΎΡ€ ΠΊΠ½ΠΎΠΏΠΊΠΈ
    .on('click', function (data, index) {        // установка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° наТатия ΠΌΡ‹ΡˆΠΈ
        button.classed('pressed', pressed = !pressed)  // Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ мСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ вычисляСм класс
    })

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° jsfiddle.net

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ сохранённой Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ button Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ: Π²Ρ‹Π·ΠΎΠ²Ρ‹ on (Π° Ρ‚Π°ΠΊ ΠΆΠ΅ classed, attr, style, property, html, text) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ для Β«Ρ‚Π΅ΠΊΡƒΡ‡ΠΈΡ…Β» интСрфСйсов.

D3 ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ значСния схоТим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ [value], скорСС всСго Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

  • Если Π²Ρ‹ ΠΏΠΎΠ΄Π°Π΄ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ΠΎ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ data, index (см. Π½ΠΈΠΆΠ΅), Π° контСкстом (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ this) Π±ΡƒΠ΄Π΅Ρ‚ элСмСнт, DOM-ΡƒΠ·Π΅Π».
  • Если Π²Ρ‹ ΠΏΠΎΠ΄Π°Π΄ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‘Ρ€Π½ΡƒΡ‚ΠΎ Π² Β«Ρ„ΡƒΠ½ΠΊΡ‚ΠΎΡ€Β» (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)
  • Если Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Π°Π΄ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, функция сработаСт ΠΊΠ°ΠΊ getter ΠΈ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ΄Ρ‘Ρ‚ Ρ€Π΅Ρ‡ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, selection.style(‘color’) Π²Π΅Ρ€Π½Ρ‘Ρ‚ Ρ†Π²Π΅Ρ‚ тСкста, Ссли ΠΎΠ½ установлСн для элСмСнта).

О послСднСм нюансС Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ссли Π²Ρ‹ строитС Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Ρ‚Π°ΠΊΠΎΠΉ getter ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ послСдним элСмСнтом Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ).

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ значСния ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅, послС Ρ‡Π΅Π³ΠΎ D3 ΠΎ Π½ΠΈΡ… Β«Π·Π°Π±Ρ‹Π²Π°Π΅Ρ‚Β». Π˜Π½Ρ‹ΠΌΠΈ словами, измСнСния Π² Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ события Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ Π½Π΅ заставят D3 Β«ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒΒ» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, поэтому это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Π²Ρ‹ΡˆΠ΅ сдСлали с classed.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (data ΠΈ index). Они ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: index β€” Π½ΠΎΠΌΠ΅Ρ€ элСмСнта Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅, Π° data β€” Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ для Π½Π΅Π³ΠΎ элСмСнт Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π½Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΡ… ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π² D3. Π­Ρ‚ΠΎ позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠΉ состояния свойств элСмСнтов Π² зависимости ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ….

Випичная Ρ€Π°Π±ΠΎΡ‚Π° с Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ

Рассмотрим популярныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π° Π±ΠΎΠ»Π΅Π΅ слоТном ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с DOM-ΡƒΠ·Π»Π°ΠΌΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ:

var svg = d3.select('body').append('svg')
svg
    .append('text')
    .text('click somewhere')
    .attr('x', 50)
    .attr('y', 50)
var events = []
svg.on('click', function () {
    events.push(d3.event)
    if (events.length > 5) events.shift()
    var circles = svg.selectAll('circle')
        .data(events, function (e) { return e.timeStamp })
        .attr('fill', 'gray')
    circles
        .enter()
        . append('circle')
        .attr('cx', function (d) { return d.x || d.pageX })
        .attr('cy', function (d) { return d.y || d.pageY })
        .attr('fill', 'red')
        .attr('r', 10)
    circles
        .exit()
        .remove()
})

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° jsfiddle.net

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ selection.html() ΠΈ selection.text() Π·Π°Π΄Π°ΡŽΡ‚ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ содСрТимоС элСмСнтов Π² Π²ΠΈΠ΄Π΅ HTML ΠΈΠ»ΠΈ тСкста.
  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ selection.style(), selection.attr() ΠΈ selection.property() Π·Π°Π΄Π°ΡŽΡ‚ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ CSS-свойства элСмСнта, Π΅Π³ΠΎ Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ свойства. Π§Π°Ρ‰Π΅ всСго ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ style ΠΈ attr, особСнно ΠΏΡ€ΠΈ описании свойств Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ selection.remove() удаляСт элСмСнты Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ.
  • selection.append() добавляСт ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ.
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² selection.data() Π΄Π°Π½Π½Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ»Π΅ __data__ DOM-элСмСнта, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π° Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ происходит ΠΈΡ… ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· элСмСнта.
  • ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ΄ΠΈΠ½ элСмСнт ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ selection. datum().
БвязанныС мноТСства

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ data(). Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽ ΠΏΠΎΠΌΠΈΠΌΠΎ списка элСмСнтов соотвСтствиС Π΄Π°Π½Π½Ρ‹Ρ… элСмСнтам. Π’ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Thinking with Joins ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассказываСм ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… enter() ΠΈ exit() ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Ρƒ Ρ‚Π°ΠΊΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈ возмоТностях ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π΄Π°ΡŽΡ‚.

Анимация ΠΈ настройка

ΠΠ½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойств элСмСнта Π² D3 Π»Π΅Π³ΠΊΠΎ, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ selection.transition(). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ, которая постСпСнно измСняСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния Π½Π° Π½ΠΎΠ²Ρ‹Π΅, создавая Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ эффСкт. Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ задаётся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ transition.duration().

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ элСмСнтов Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

var svg = d3.select('body').append('svg')
svg
    .append('text')
    .text('click here')
    .attr('x', 50)
    .attr('y', 50)
var events = []
svg. on('click', function () {
    events.push(d3.event)
    if (events.length > 5) events.shift()
    var circles = svg.selectAll('circle')
        .data(events, function (e) { return e.timeStamp })
        .attr('fill', 'gray')
    circles
        .enter()
        .append('circle')
        .attr('cx', function (d) { return d.x || d.pageX })
        .attr('cy', function (d) { return d.y || d.pageY })
        .attr('fill', 'red')
        .attr('r', 0) // ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
        .transition()
        .duration(1000) // Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ
        .attr('r', 10) // ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    circles
        .exit()
        .transition()
        .attr('r', 0)
        .remove()
})

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° jsfiddle.net

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я рассказал ΠΎ возмоТностях D3 ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π²Ρ‹Π±ΠΎΡ€ΠΊΠ°ΠΌΠΈ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΏΠΎΡΠ²ΡΡ‚ΠΈΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ Π½Π°Π±ΠΎΡ€ΠΎΠ² SVG-элСмСнтов ΠΈ созданию ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… элСмСнтов Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π― ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°ΡŽ D3 Π½Π° курсС «Визуализация Π΄Π°Π½Π½Ρ‹Ρ…Β». Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ этот инструмСнт ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ Π½Π°ΠΌ. Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΉ курс ΠΏΡ€ΠΎΠΉΠ΄Ρ‘Ρ‚ Π² МосквС Π² эти Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅, запись ΠΈ ΠΎΡ‚Π·Ρ‹Π²Ρ‹ участников январского курса: http://brainwashing.pro/dataviz.

Быстро ΠΎ Π³Π»Π°Π²Π½ΠΎΠΌ: визуализация с D3.js | by Jenny V | NOP::Nuances of Programming

D3, сокращСнно ΠΎΡ‚ Data-Driven Documents, β€” это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° JavaScript, которая позволяСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ самыми Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами ΠΈ содСйствуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ элСмСнтами DOM.

D3 Π½Π΅ относится ΠΊ разряду Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ. Она ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΈ усилСна возмоТностями Recharts, C3js ΠΈ Raw graphs. Π•Π΅ прСимущСство ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ: Ρ‚Π°ΠΌ, Π³Π΄Π΅ обычная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ‚Π΅Ρ€ΠΏΠΈΡ‚ фиаско, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ слишком ΡƒΠ²Π»Π΅ΠΊΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ настройками, D3 ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ познакомимся с D3 Π½Π° основС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². ΠžΠ±Ρ‰ΠΈΠΉ процСсс сводится ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ этапам: Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… β€” Π²Ρ‹Π±ΠΎΡ€ΠΊΠ° элСмСнтов β€” привязка Π΄Π°Π½Π½Ρ‹Ρ… β€” созданиС/ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅/ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов.

Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ порисуСм Π½Π° Π²Π΅Π±-страницС ΠΈ попрактикуСмся Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ сСлСкторов ΠΈ Ρ„ΠΈΠ³ΡƒΡ€ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ².

РисованиС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€

Как ΠΆΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ с D3? ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго создаСм HTML-страницу, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ пустой элСмСнт SVG (Π°Π±Π±Ρ€Π΅Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΊΠ°ΠΊ язык Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ). Для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚, SVG β€” это ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, состоящСС ΠΈΠ· основных гСомСтричСских Ρ„ΠΈΠ³ΡƒΡ€, благодаря Ρ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΎ становится Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ. Как Ρ€Π°Π· для рисования Ρ‚Π°ΠΊΠΈΡ… Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ понадобится D3.

Π‘Π½Π°Ρ‡Π°Π»Π° для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° D3 создаСм HTML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π° протяТСнии всСй ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ‚Π΅Π³Π°ΠΌΠΈ скрипта.

Π’ строкС 4 ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ D3. Если Ρƒ вас frontend-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ с Node.js, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ NPM. Π’ строкС 7 опрСдСляСм элСмСнт SVG, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹.

НапишСм ΠΏΠ΅Ρ€Π²Ρ‹Π΅ строки ΠΊΠΎΠ΄Π° D3:

Π’ строкС 2 задСйствуСм ΠΌΠ΅Ρ‚ΠΎΠ΄ d3.select(). Он Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт с CSS-сСлСктором, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ рассматриваСмом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π° страницС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚Π΅Π³ <svg>, поэтому ΠΎΠ½ Π²Π΅Ρ€Π½Π΅Ρ‚ СдинствСнно ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ элСмСнт SVG.

ПозТС обратимся ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ d3.selectAll(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π΅ ΠΎΠ΄ΠΈΠ½, Π° всС элСмСнты, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ CSS-сСлСктору.

Π’ строкС 4 ΠΊ элСмСнту SVG добавляСм β€œcircle” (ΠΊΡ€ΡƒΠ³). Помимо Π½Π΅Π³ΠΎ Π² нашСм распоряТСнии Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ мноТСство Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€. Π’ строкС 5 примСняСм Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² D3, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ избавляСт ΠΎΡ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ svg.function(...) Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС.

Π’ строках 5, 6, 7 ΠΈ 8 устанавливаСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ d3.attr, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹. cx ΠΈ cy β€” ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΊΡ€ΡƒΠ³Π°; r β€” радиус; fill β€” Ρ†Π²Π΅Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΠΈ. Π­Ρ‚ΠΎ фиксированныС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Π‘ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈΡ… использования для основных гСомСтричСских Ρ„ΠΎΡ€ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ Π½Π° freeCopeCamp.

Π˜Ρ‚Π°ΠΊ, Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠšΡ‚ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного. Однако позволю сСбС Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒΡΡ. Π”Π°ΠΆΠ΅ самыС слоТныС графичСскиС изобраТСния ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… простых Ρ„ΠΈΠ³ΡƒΡ€.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ:

ДобавляСм Ρ„ΠΈΠ³ΡƒΡ€Ρƒ rect ΠΈ устанавливаСм Π½ΡƒΠΆΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ для Π΅Π΅ отобраТСния. Π—Π°Ρ‚Π΅ΠΌ выполняСм ΠΊΠΎΠ΄ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π‘ основными ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ добавлСния Ρ„ΠΈΠ³ΡƒΡ€ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ вопросу Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ графичСским изобраТСниям Π½Π° ΠΈΡ… основС.

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

Для получСния Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² D3 сущСствуСт мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НачнСм с самых интСрСсных: d3.json('...'), d3.csv('...') ΠΈ d3.xml('...').

Для Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΈ всС ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Fetch. CSV, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ JSON ΠΈ XML, Π½Π΅ допускаСт Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… (socialnetwork. json) ΠΈΠ· Π²Ρ‹ΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти ΠΈ стилями, прСдставлСнными Π½ΠΈΠΆΠ΅:

Π‘Π½Π°Ρ‡Π°Π»Π° построим гистограмму для Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. По Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ Π³ΠΎΠ΄Ρ‹ (years), Π° ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ β€” количСство ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² (comments). Для этой Ρ†Π΅Π»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ соотвСтствСнно d3.axisBottom() ΠΈ d3.axisLeft(). Π’ ΠΊΠΎΠ΄Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ рисованиС осСй происходят ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Как ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°! Π‘Π΅Π· ΠΏΠ°Π½ΠΈΠΊΠΈ, рассмотрим ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π’ строкС 3 ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ JSON. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ d3.json() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ промис, Π½Π°ΠΌ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· .then() ΠΈΠ»ΠΈ await, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ окончания ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это происходит, Π² строках 5 ΠΈ 10 приступаСм ΠΊ созданию Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² отрисовкС Π΄Π°Π½Π½Ρ‹Ρ…. Допустим, ΠΌΡ‹ рассматриваСм Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ с 2015 ΠΏΠΎ 2020 Π³ΠΎΠ΄ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ 500 Ρ… 500 пиксСлСй. ΠŸΡ€ΠΈ отрисовкС Π½ΠΎΠΌΠ΅Ρ€Π° Π³ΠΎΠ΄Π° Π½Π° оси x Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ 2015–2020 Π² 0–500.

Π‘Π°ΠΌΠΎΠ΅ врСмя для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Одна ΠΈΠ· Π½ΠΈΡ…, .scaleLinear(), Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ чисСл (domain) Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ (range). Π’ строкС 7 ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (range)[100,800], ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ отрисовку с 100-Π³ΠΎ пиксСля ΠΏΠΎ оси x, Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ Π½Π° 800-ΠΌ.

ПослС этого происходит ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (domain), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ. .domain() ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ массив с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ значСниями. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρƒ D3 Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ d3.extent(), d3.max() ΠΈ d3.min(). Π’ строкС 8 устанавливаСм минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ minimum of years β€” 1 ΠΈ максимальноС maximum of years + 1. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π² дальнСйшСм ΠΎΡ‚Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ столбцы гистограммы.

Π’ строкС 13 Π΄Π΅Π»Π°Π΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ось Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с 0, Π° Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ числом ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Наша Π·Π°Π΄Π°Ρ‡Π° β€” ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ 150, Π° Π½Π΅ ΠΎΡ‚ 50 Π΄ΠΎ 150.

d3. extent() Π²Π΅Ρ€Π½Π΅Ρ‚ массив ΠΈΠ· максимального ΠΈ минимального Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ [max, min], избавляя ΠΎΡ‚ нСобходимости Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Π΅ΠΌ ΠΊ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ оси: Π² строкС 15 добавляСм ось x. Π’ цСлях стилизации присваиваСм Π΅ΠΉ класс ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ элСмСнт g, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ось x всСгда рисуСтся ΠΈΠ· Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, располоТСнного Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сдвигаСм g Π½Π° Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒ, послС Ρ‡Π΅Π³ΠΎ выполняСм .call(d3.axisBottom(x).tickFormat(d3.format("d")). Ѐункция .axisBottom рисуСт ось. (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ range, поэтому ΠΎΠ½Π° Π·Π½Π°Π΅Ρ‚, Π² ΠΊΠ°ΠΊΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ range/domain Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ). Π—Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ функция .tickFormat() сообщаСт D3, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ дСлСния Π½Π° оси. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ "d" для обозначСния простых чисСл Π² ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ ΠΎΡ‚ 2014 Π΄ΠΎ 2021.

Π”Π°Π»Π΅Π΅ практичСски Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ для отрисовки оси y, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мСняСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ transform, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ эту ось Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎ для отобраТСния Π΄Π΅Π»Π΅Π½ΠΈΠΉ.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° элСмСнтов ΠΈ привязка Π΄Π°Π½Π½Ρ‹Ρ…

На этом этапС Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Π² зависимости ΠΎΡ‚ числа ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Π‘ этой Ρ†Π΅Π»ΡŒΡŽ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ SVG ΠΈ привязку Π΄Π°Π½Π½Ρ‹Ρ…. ПишСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π‘Π½Π°Ρ‡Π°Π»Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ d3.select() для получСния SVG. (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΊΠΎΠ΄Π° ΠΌΡ‹ Π΅Π΅ сохранили Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ svg). Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСлСктора CSS selector .barchartrectangle ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ поиск ΠΈ ΠΎΡ‚Π±ΠΈΡ€Π°Π΅ΠΌ всС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ гистограммы. Π­Ρ‚ΠΎ связано с процСссами обновлСния: Ссли массив измСнится, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ для ΠΈΡ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π»ΠΈΠ±ΠΎ удалСния.

Π”Π°Π»Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ .data(), которая содСрТит ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ data, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈ этом Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ опрСдСляСт ΠΊΠ»ΡŽΡ‡. Для этого ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΡƒΡŽ элСмСнт (item) ΠΈ индСкс (index). Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ возвращаСтся индСкс.

Однако, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ поля элСмСнта для выявлСния Ρ‚Π΅Ρ… элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‚ измСнСнию/ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ/вставкС. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ свойства id Π² датасСтС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ (item, index)=> item.id.

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ добавлСнию ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ².

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов

Когда происходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² массивС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡƒΡ‚Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ), D3 сравниваСт массивы ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 2 Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ .enter() ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ .exit().

ΠŸΠΎΠ½ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Рассмотрим использованиС этого массива Π² качСствС Π΄Π°Π½Π½Ρ‹Ρ… [1,2,3] ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°.

Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ .barchartrectangle Π²Π΅Ρ€Π½Π΅Ρ‚ 0 элСмСнтов, поэтому D3 Π² курсС, Ρ‡Ρ‚ΠΎ элСмСнты Π² массивС ΡΠ²Π»ΡΡŽΡ‚ΡΡ трСмя Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½Π° задСйствуСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ .enter(). Π’ Π½Π΅ΠΉ ΠΌΡ‹ присоСдиняСм Π½ΠΎΠ²Ρ‹Π΅ rect ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ присваиваСм ΠΈΠΌ класс barchartrectangle. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ β€œΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΉβ€ Π½Π΅Ρ‚, инструкция .exit() Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ массива Π½Π° [1,2] ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° сСлСктор .barchartrectangle Π²Π΅Ρ€Π½Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… элСмСнта. Однако D3 ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² массивС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²ΡƒΡ…. Π’ΠΎΠ³Π΄Π° ΠΎΠ½Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функциями, связанными с инструкциСй .exit(), ΠΈ Π² этом случаС ΡƒΠ΄Π°Π»ΠΈΡ‚ .remove() Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΈΠ· Π½ΠΈΡ….

Как D3 ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ элСмСнт слСдуСт ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ? Π­Ρ‚ΠΎ зависит ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π½Π΅Π΅. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠΌ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ являСтся индСкс, поэтому ΠΎΠ½ ΡƒΠ΄Π°Π»ΠΈΡ‚ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт. Но Ссли элСмСнт оказался фактичСским id (item, index)=> item, ΠΈ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ массив Π½Π° [1,3], Ρ‚ΠΎ вмСсто Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½ Π²Ρ‚ΠΎΡ€ΠΎΠΉ barchartrectangle.

Π Π°Π±ΠΎΡ‚Π° инструкций .enter() ΠΈ .exit() Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ понятна, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ гистограммы.

Π’ строкС 4 примСняСм .enter() ΠΈ Ρ‚Π΅ΠΌ самым инструктируСм D3, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’ строкС 5 добавляСм Π½ΠΎΠ²Ρ‹ΠΉ rect ΠΈ устанавливаСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Как Π²ΠΈΠ΄Π½ΠΎ Π² строках 6 ΠΈ 7, функция .attr() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ фиксированныС значСния, Π½ΠΎ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ элСмСнт ΠΈ Π΅Π³ΠΎ индСкс, Ρ‡Ρ‚ΠΎ позволяСт ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ элСмСнты Π² зависимости ΠΎΡ‚ Π΄Π°Π½Π½Ρ‹Ρ….

Π‘Π½Π°Ρ‡Π°Π»Π° Π² строкС 6 ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ x ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ x, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π½Π΅Π΅ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Π³ΠΎΠ΄Π°. Π’ ΠΎΡ‚Π²Π΅Ρ‚ вСрнСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пиксСля, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ гистограмму. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π»Π΅Π΅ ΡˆΠΈΡ€ΠΈΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ установлСна ΠΊΠ°ΠΊ 100, Ρ‚ΠΎ ΠΌΡ‹ подстраиваСм столбСц ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ этого значСния, выполняя -50. Для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ y просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’ строкС 9 для опрСдСлСния высоты выполняСм 800- y(item. comments) ΠΈΠ·-Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Напомню, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ [800, 100], поэтому ΠΌΠ°Π»Ρ‹Π΅ значСния ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² большиС значСния пиксСлСй. Π’ связи с этим ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, выполняя 800 β€” y(item.comments).

НаконСц, для ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π΄Π°Π΅ΠΌ синий Ρ†Π²Π΅Ρ‚ Π·Π°Π»ΠΈΠ²ΠΊΠΈ. Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! На основС Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ отрисовали Π½Π° экранС гистограмму. Π’ этом ΠΈ состоит вся ΡΡƒΡ‚ΡŒ D3. Но Ρƒ Π½Π΅Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС возмоТностСй. На D3.js β€” Data-Driven Documents (d3js.org) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с интСрСсными Π³Ρ€Π°Ρ„ΠΈΠΊΠ°ΠΌΠΈ ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌΠΈ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ посрСдством Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ D3. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π² SVG Π½Π° основС динамичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

А Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ интСрСсного: Π³Π΅ΠΎΠΊΠ°Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ HTML, визуализация сСтСвых процСссов ΠΈ Ρ‚.Π΄. D3 Ρ†Π΅Π½Π½Π° ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ прСдоставляСт ΠΏΠΎΡ‡Ρ‚ΠΈ Π±Π΅Π·Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹Π΅ возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅:

  • notebookJS: JavaScript ΠΈ D3 Π² Jupyter Notebook
  • ΠŸΠΎΡ‡Π΅ΠΌΡƒ я большС Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ D3.js
  • ВОП-25 Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ React 2021–2022: Π½ΠΎΠ²Ρ‹Π΅, ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅, Π½ΠΎ малоизвСстныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ JavaScript

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ нас Π² Telegram, VK ΠΈ ЯндСкс.Π”Π·Π΅Π½

d3-hierarchy / D3 / Observable

Алгоритмы 2D ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ иСрархичСских Π΄Π°Π½Π½Ρ‹Ρ….

с ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ 1-30 ΠΈΠ· 32 списков

D3. Π“Ρ€ΡƒΠΏΠΏΡ‹ Π² качСствС ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ

D3 β€’ FIL

15 сСнтября 2020 Π³. β€’

54

4

Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ

D3 β€’ Mike Bostock

Secp 29, Secp 29. 2018β€’

36

ΠžΠ±Ρ…ΠΎΠ΄ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ, Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ

D3β€’Fil

6 июля 2020 Π³.β€’

21

Bilevel Edge Bundling

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой FORK

D3 β€’ Mike Bostock

24 мая 2018 Π³. β€’

33

БДЕЛАННЫЕ Π”Π•Π Π•Π’Πž

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ — FOK

D3 β€’ Mike Bostock

1, 2020 β€’

90

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой FORK

D3 β€’ Mike Bostock

Dec 30, 2019 β€’

86

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π³Ρ€Π°Π΄

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ° — BOSK

D3 β€’ Mike Bostock

9 000, 2019 β€’

99

. Π“Ρ€Π°Ρ„ΠΈΠΊ

D3β€’Mike Bostock

Jan 7, 2019β€’

42

d3.packEnclose

D3β€’Mike Bostock

May 26, 2017β€’

56

Hierarchical Bar Chart

D3β€’Mike Bostock

5 июля 2019 Π³. β€’

116

, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ΅ Π½Π° силовоС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ°-это Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

26 июня 2019 Π³. β€’

91

3

D3. Бтратификация

D3 β€’ FIL

14 июня 2019 Π³. β€’

31

ΠŸΠΎΡΠ΅Ρ‰Π΅Π½ΠΈΠ΅ D3.Hierarchy

D3 β€’ FIL

14 июня 2019 Π³. β€’

24

D3.HIERARCHY Записная ΠΊΠ½ΠΈΠΆΠΊΠ° — это Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

10 ΠΌΠ°Ρ€Ρ‚Π° 10, 2019 β€’

22

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ TreeMap

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ — Bostk

D3 β€’ Mike Bostock

10 ΠΌΠ°Ρ€Ρ‚Π° 2019 Π³. β€’

38

1 0003

Dreemp ΠΏΠΎ количСству 

Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊΠ½ΠΎΡ‚ прСдставляСт собой Π²ΠΈΠ»ΠΊΡƒ

D3 β€’ Mike Bostock

10 ΠΌΠ°Ρ€Ρ‚Π° 2019 Π³. β€’

7

Растянутая TreeMap

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой Π²ΠΈΠ»ΠΊΡƒ

D3 β€’ Mike Bostock

10 ΠΌΠ°Ρ€Ρ‚Π° 2019 β€’

14

Π‘ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ

D3 β€’ Mike Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost Bost.

1 октября 2018 Π³. β€’

294

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ края объСдинСния

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° — это Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

23 мая 2018 β€’

183

3

D3 β€’ Mike Bostock

26 ноября 2018 Π³. β€’

258

Zoomable Sunburst

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ° — Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

30 апрСля 2018 β€’

390

3

, Sunbure

3

. D3 β€’ Mike Bostock

28 апрСля 2018 Π³. β€’

139

4

TREEMAP, CSV

D3 β€’ Mike Bostock

Dec 28, 2017 β€’

126

3

Tree, Radial Tidy

3

Tree, Radial Tidy

3

Tree, Radial Tidy

3

Tree, Radial Tidy

3

Tree, Radial Tidy

3

Tree. β€’ Майк Босток

16 ноября 2017 Π³. β€’

167

Tree, Cluster

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой Fork

D3 β€’ Mike Bostock

дСкабря 2017 Π³. β€’

76

4

Π¦ΠΈΠ»ΡŒΡΡ‹. D3 β€’ Mike Bostock

30 апрСля 2018 Π³. β€’

93

Tree, Tidy

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° — это Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

Dec 28, 2017 β€’

169

ΠšΡ€ΡƒΠΆΠ½Π°Ρ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠ°, Bubble Chart

это Π²ΠΈΠ»ΠΊΠ°

D3 β€’ Mike Bostock

28 дСкабря 2017 Π³. β€’

112

2

ΠŸΠ•Π Π•Π”Π˜Π’, Icicle

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° — Fork

D3 β€’ Mike Bostock

28 апрСля 2018 β€’

33

1 0003

ПоявлСниС. 1-30 из 32 объявлСний

Π˜Π·Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΡ€Ρ‹ / Observable / Observable

Observable

@observablehq

ProfileNotebooksCollections

0003 Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой VOK

Helena Oliveira

сСнтября 28

Voronoi Cells

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ° — Π²ΠΈΠ»ΠΊΠ°

Ben Simonds

Sep 28 β€’

22

Taylor Polynomials

Amit Sch

SEP 28.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

Euclidean Rhythms

Torben Jansen

24 сСнтября β€’

64

2

НасСлСниС сСтки (15 ΠΌΠΈΠ½ΡƒΡ‚) — Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Π΅ Π¨Ρ‚Π°Ρ‚Ρ‹

Evan Galloway

Sep 2 β€’

5

0003

Marcas Y Canales

Π­Ρ‚Π° записная ΠΊΠ½ΠΈΠΆΠΊΠ° прСдставляСт собой Fork

NΓ©stor AndrΓ©s PeΓ±a

ΡΠ΅Π½Ρ‚ΡΠ±Ρ€ΡŒ 14 β€’

1

ΠžΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅

Π­Ρ‚ΠΎ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ — FORB

GRAB SUSMANN

SEP 5 β€’

21

Zoomble

SEP 5 β€’

9000 21

Zoomble

SEP 5 β€’

21

Zoom. Schudel

август 18 β€’

43

ОкСанскиС Ρ‚ΠΎΠΊΠΈ

Tom Macwright

Aug 12 β€’

24

MAROPLETH MAP

ΠšΡ€ΠΈΡ Π₯Π΅Π½Ρ€ΠΈΠΊ

Aug 26 β€’

13

Animated Mapbox Vector Fields (aka Wind Maps)

Corey Guastini

Aug 15β€’

35

New Yorkers from Canada to the AmboysΒ 

This notebook is a fork

Benjamin Schmidt

Jul 10β€’

29

2

ΠšΠ°Π»ΠΈΡ„ΠΎΡ€Π½ΠΈΠΉΡ†Ρ‹ ΠΎΡ‚ ΠžΡ€Π΅Π³ΠΎΠ½Π° Π΄ΠΎ МСксики

Π”ΠΆΠ΅Ρ„Ρ„Ρ€ΠΈ Π‘Π΅ΠΉΠΊΠ΅Ρ€

9 июля 9β€’

24

ΠŸΡΡ‚ΡŒ Π»Π΅Ρ‚ слСТСния Π·Π° свободой прСссы

90 Augβ€’ 3 Harris 90 Lapiroff0003

5

Π–Π΅Π½Ρ‰ΠΈΠ½Ρ‹ Π² космосС πŸ‘©πŸΌβ€πŸš€

Raluca Nicola

28 ΠΌΠ°Ρ€Ρ‚Π°, 2021 β€’

62

Японский ΠΎΡ‚ Hokkaido Π΄ΠΎ Okinawa

. Π­Ρ‚ΠΎΡ‚ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ — FORK

Sorami Hisamoto

Aug 21.

Как Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Dataviz

Tom Larkworthy

ΠΠ“Π›Π˜Π’ΠΠ― 16 β€’

22

Π“ΠΎΠ»Π»Π°Π½Π΄Ρ†Ρ‹ ΠΎΡ‚ Eemshaven Π΄ΠΎ Epen

Π–ΡŽΠ»ΡŒ Π‘Π»Π°ΠΌ

Aug 17 β€’

21

Π’ΠΎΠΌ. согласованиС Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½Ρ‹Ρ… структур

ΠœΠ°Ρ‚ΡŒΠ΅ Жуэ

31 июля β€’

27

Насколько ΠΌΡƒΠΆΡ‡ΠΈΠ½Ρ‹ Π²Ρ‹ΡˆΠ΅ ΠΆΠ΅Π½Ρ‰ΠΈΠ½?

Tereza iofciu

Π°ΠΏΡ€Π΅Π»ΡŒ 28 β€’

6

АтомныС Π°Π³Π΅Π½Ρ‚Ρ‹: ΠΏΠΎΠ»ΠΈΠ»ΠΈΠ½Ρ‹ ΠΈ силы

Π­Ρ‚Π° Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ — Π²ΠΈΠ»ΠΊΠ°

Graham McNeill

5 β€’

65

Π‘Ρ‚Ρ€ΠΎΠΈΠΆΠΈ

3 мая 2021 Π³. β€’

24

Π’Π°Π±Π»ΠΈΡ†Π° умноТСния

SUGIMOTO Tatsuo

август 3 β€’

21

Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅

JO WOOD

13 июля β€’

60

2

ИспользованиС участка Π²ΠΎΠΊΡ€ΡƒΠ³ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°

Anjana Vakil

Apr 19 β€’

4

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΠΊΠ°Ρ€Ρ‚Π°: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь: дСнь.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *