Диаграмма с изображениями: пользовательские формы и векторные графические столбцы

При представлении категориальных метрик, которые выигрывают от немедленной визуальной ассоциации, Диаграмма с изображениямипредлагает творческую и увлекательную альтернативу стандартным прямоугольным столбцам. Заменяя сплошные цветные блоки на пользовательские векторные иконки, пути SVG или повторяющиеся символы, диаграммы с изображениями превращают обычные сводки данных в визуально описательные инфографики—например, человеческие иконки для статистики населения, формы транспортных средств для метрик движения или символы фруктов для подсчёта урожая.

Механика диаграмм с изображениями

В Apache ECharts диаграммы с изображениями используют type: 'pictorialBar'. Они работают на стандартных категориальных и числовых осях, как и обычные столбчатые диаграммы, но заменяют прямоугольные столбцы на настраиваемые графические элементы, определяемые свойством symbol (например, стандартные формы, URL-адреса изображений или строки путей SVG).

1. Основная настройка

Чтобы создать диаграмму с изображениями с несколькими рядами, настройте категориальные и числовые оси, определите type: 'pictorialBar' для всех рядов и настройте индивидуальные символы точек непосредственно в массиве data массиве:

option = {
  title: {
    text: "Урожай фермерского рынка",
    left: 'center'
  },
  legend: {
    data: ['Весна', 'Лето'],
    top: '8%'
  },
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'shadow'
    }
  },
  grid: {
    containLabel: true,
    top: '18%',
    left: 20
  },
  yAxis: {
    data: ['Яблоки', 'Апельсины', 'Бананы', 'Виноград', 'Клубника'],
    inverse: true,
    axisLine: { show: false },
    axisTick: { show: false },
    axisLabel: {
      margin: 30,
      fontSize: 14
    }
  },
  xAxis: {
    splitLine: { show: false },
    axisLabel: { show: false },
    axisTick: { show: false },
    axisLine: { show: false }
  },
  series: [
    {
      name: 'Весна',
      type: 'pictorialBar',
      symbolRepeat: true,
      symbolSize: ['80%', '60%'],
      barCategoryGap: '40%',
      data: [
        { value: 320, symbol: 'circle' },
        { value: 180, symbol: 'rect' },
        { value: 410, symbol: 'diamond' },
        { value: 95, symbol: 'triangle' },
        { value: 240, symbol: 'roundRect' }
      ]
    },
    {
      name: 'Лето',
      type: 'pictorialBar',
      barGap: '10%',
      symbolRepeat: true,
      symbolSize: ['80%', '60%'],
      data: [
        { value: 290, symbol: 'circle' },
        { value: 210, symbol: 'rect' },
        { value: 520, symbol: 'diamond' },
        { value: 130, symbol: 'triangle' },
        { value: 310, symbol: 'roundRect' }
      ]
    }
  ]
};

 

Расширенные структурные техники

Диаграммы с изображениями могут последовательно повторять иконки для создания счётчиков инфографики на основе единиц или использовать маски для создания визуализаций уровня заполнения.

1. Шаблоны счётчиков единиц для одного ряда

Включите symbolRepeat: trueна одной числовой оси, чтобы отобразить горизонтальные стопки символов, основанные на единицах:

option = {
    tooltip: {
        trigger: 'axis'
    },
    xAxis: {
        type: 'value',
        max: 10,
        splitLine: { show: false }
    },
    yAxis: {
        type: 'category',
        data: ['Команда Альфа', 'Команда Бета', 'Команда Гамма'],
        axisLine: { show: false },
        axisTick: { show: false }
    },
    series: [
        {
            type: 'pictorialBar',
            symbol: 'roundRect',
            symbolRepeat: true,
            symbolSize: [12, 30],
            symbolMargin: 4,
            data: [8, 5, 9],
            itemStyle: {
                color: '#91cc75'
            }
        }
    ]
};

 

Тонкая настройка макета и пользовательских фигур SVG

Использование пользовательских строк векторных SVG-путей позволяет отображать индивидуальные значки непосредственно внутри серии диаграммы.

1. Пользовательский векторный путь и наложение фона

Укажите пользовательскую строку SVG-пути в symbol и наложите полноформатный фоновый рисунок под ним, чтобы создать индикаторы типа «прогресс»:

const pathBattery = 'path://M16 4h-2V2a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v2H8a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z';

option = {
    title: {
        text: 'Уровень заряда устройств',
        left: 'center'
    },
    tooltip: {
        trigger: 'axis',
        axisPointer: { type: 'none' }
    },
    grid: {
        top: '20%',
        bottom: '15%',
        left: '10%',
        right: '10%'
    },
    xAxis: {
        type: 'category',
        data: ['Узел A', 'Узел B', 'Узел C', 'Узел D'],
        axisLine: { show: false },
        axisTick: { show: false }
    },
    yAxis: {
        type: 'value',
        max: 100,
        show: false
    },
    series: [
        {
            name: 'Оболочка аккумулятора',
            type: 'pictorialBar',
            symbol: pathBattery,
            symbolSize: ['60%', '100%'],
            symbolPosition: 'start',
            symbolBoundingData: 100,
            symbolClip: false,
            itemStyle: {
                color: '#e2e8f0' // Пустая оболочка фона
            },
            data: [100, 100, 100, 100],
            z: 1
        },
        {
            name: 'Уровень заряда',
            type: 'pictorialBar',
            symbol: pathBattery,
            symbolSize: ['60%', '100%'],
            symbolPosition: 'start',
            symbolBoundingData: 100,
            symbolClip: true, // Заполняется пропорционально значению
            label: {
                show: true,
                position: 'top',
                formatter: '{c}%',
                fontSize: 14,
                fontWeight: 'bold',
                color: '#333'
            },
            itemStyle: {
                color: '#22c55e' // Зелёное заполнение активного заряда
            },
            data: [85, 45, 92, 20],
            z: 2
        }
    ]
};

 

Стратегические лучшие практики

  • Назначайте символы для каждого элемента, чтобы выделить разные категории: Передавайте отдельные symbol определения внутри объектов данных (например, { value: 320, symbol: 'circle' }) для визуального различия строк без чисто цветовой зависимости.
  • Держите метафоры значков понятными: Выбирайте символы, которые напрямую соответствуют теме данных (например, силуэты пользователей для демографических данных или значки аккумуляторов для метрик мощности), чтобы визуализация была сразу понятна.
  • Используйте symbolClip: true для индикаторов заполнения: При отображении процентных метрик на фоне полностью заполненных областей установите symbolClip: true в активной серии, чтобы пользовательская векторная форма заполнялась пропорционально.
Прокрутить вверх