Data Visualization Demo — это интерактивный проект, демонстрирующий возможности визуализации данных с использованием библиотеки Chart.js в среде React/Next.js. Проект создан с целью исследования и демонстрации широких возможностей Chart.js для работы с различными типами данных и форматами их представления.
- ✨ Продемонстрировать гибкость и мощь библиотеки Chart.js для визуализации данных
- 📈 Показать различные способы загрузки и обработки данных (JSON, Excel/CSV)
- 🖱️ Предоставить интерактивный интерфейс для настройки параметров визуализации
- 🏗️ Создать основу для быстрой интеграции визуализации данных в другие проекты
| Категория | Стек |
|---|---|
| 🖥️ Frontend | Next.js, React, TypeScript |
| 🧩 UI | Ant Design |
| 📊 Визуализация | Chart.js, chartjs-plugin-zoom |
| 📄 Данные | ExcelJS для работы с Excel/CSV |
| ☁️ Хостинг | Vercel |
Проект построен на основе компонентного подхода и состоит из двух основных блоков:
- 📥 Компонент загрузки данных (DataUploader) — отвечает за загрузку, парсинг и подготовку данных из различных источников
- 📊 Компонент визуализации (ChartJSComponent) — отвечает за отображение данных в виде различных типов графиков с широкими возможностями настройки
Взаимодействие между компонентами осуществляется через передачу данных от DataUploader к ChartJSComponent, что обеспечивает гибкость и модульность решения.
Компонент DataUploader предоставляет пользователю несколько способов загрузки данных для последующей визуализации:
- ✏️ Ввод JSON-данных в текстовое поле
- 📄 Загрузка JSON-файла
- 📊 Загрузку Excel/CSV файла
- 🔍 Парсинг JSON-данных — анализ структуры JSON и автоматическое определение путей к данным
- 🗃️ Обработка Excel/CSV — извлечение данных из таблиц, работа с несколькими листами
- ✅ Валидация данных — проверка соответствия формату Chart.js
- 🖱️ Интерактивный выбор данных — возможность выбрать конкретные пути в JSON или колонки в Excel для визуализации
Компонент использует вкладки (Tabs) для переключения между различными способами загрузки данных:
- 📝 JSON text — вкладка для ввода JSON-данных в текстовое поле
- 📂 JSON file — вкладка для загрузки JSON-файла
- 📊 Excel/CSV — вкладка для загрузки Excel или CSV файла
Каждая вкладка представлена отдельным компонентом:
JsonTextTab— для работы с текстовым JSONJsonFileTab— для загрузки JSON-файловExcelFileTab— для работы с Excel/CSV файлами
Компонент использует несколько кастомных хуков для управления данными:
useJsonData— обработка JSON-данных, извлечение путей, валидацияuseExcelData— работа с Excel/CSV файлами, извлечение данных из листов и колонокuseFileUpload— управление процессом загрузки файлов, валидация размера
- 📥 Загрузка данных — через текстовое поле или файл
- 🔍 Парсинг — преобразование данных в структурированный формат
- 📊 Анализ структуры — определение доступных путей (для JSON) или колонок (для Excel)
- 🖱️ Выбор данных — пользователь выбирает, какие именно данные визуализировать
- 🔄 Преобразование — данные преобразуются в формат, совместимый с Chart.js
- ➡️ Передача — подготовленные данные передаются в компонент визуализации
Компонент ChartJSComponent отвечает за визуализацию данных с использованием библиотеки Chart.js. Он предоставляет широкие возможности настройки внешнего вида и поведения графиков.
- 📈 Поддержка различных типов графиков — линейные, столбчатые, круговые, радарные и др.
- 🎨 Настройка внешнего вида — цветовые схемы, толщина линий, отображение легенды
- 🎬 Анимация — различные типы анимаций с настраиваемыми параметрами
- 🖱️ Интерактивность — масштабирование, панорамирование, всплывающие подсказки
- 📱 Адаптивность — автоматическое изменение размера графика при изменении размера контейнера
Компонент состоит из нескольких частей:
- 🖼️ ChartCanvas — непосредственно холст для отрисовки графика
- 🏷️ ChartHeader — заголовок с информацией о типе графика
- 🎛️ ChartControls — панель управления настройками графика
Для управления состоянием используется useReducer с набором действий, определенных в chartReducer:
- 🔄 Изменение типа графика
- 📊 Изменение набора данных
- 🎨 Настройка внешнего вида (цвета, толщина линий, отображение легенды)
- 🎬 Управление анимацией
- ✏️ Настройка заголовков и подзаголовков
useChartInstance— управление экземпляром графика Chart.jsuseChartAnimation— настройка и управление анимацией графикаuseIsDarkMode— определение текущей темы (светлая/темная)
Компонент поддерживает следующие типы графиков:
| Тип | Иконка | Описание |
|---|---|---|
LINE |
📈 | Линейный график |
BAR |
📊 | Столбчатая диаграмма |
PIE |
🥧 | Круговая диаграмма |
DOUGHNUT |
🍩 | Кольцевая диаграмма |
RADAR |
📡 | Радарная диаграмма |
POLAR_AREA |
🧭 | Полярная диаграмма |
SCATTER |
🎯 | Точечная диаграмма |
BUBBLE |
🫧 | Пузырьковая диаграмма |
AREA |
🗺️ | Область |
COMBO |
🧩 | Комбинированный график |
Компонент автоматически определяет, какие типы графиков совместимы с текущим набором данных:
- 📈
SALES,USERS,REVENUE— совместимы сLINEиBAR - 🎯
PERFORMANCE— совместимы сRADARиPOLAR_AREA - 👥
DEMOGRAPHICS— совместимы сPIEиDOUGHNUT ↔️ COMPARISON— совместимы сBAR- ⏳
TIME_DATA— совместимы сLINE
При загрузке пользовательских данных доступны все типы графиков.
- 🧮 Группировка и фильтрация данных
- 💾 Экспорт графиков в PNG, SVG, PDF
- 🌐 i18n
- Подключение дополнительных плагинов (drag-and-drop, word-cloud, boxplot, venn)