Skip to content

xilec/interactive-plotters

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Интерактивные графики с plotters-rs и egui_plot

Этот проект демонстрирует возможности создания интерактивных графиков в Rust с использованием библиотеки egui_plot. Все примеры поддерживают Ubuntu и показывают, как рисовать поверх графика с автоматическим адаптивным масштабированием.

🎯 Ключевые особенности

Все нарисованные элементы автоматически масштабируются при изменении масштаба графика! Это решает основную задачу - рисование линий поверх графика с сохранением их позиций в системе координат данных.

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

📦 Установка зависимостей для Ubuntu

# Основные зависимости для egui
sudo apt update
sudo apt install build-essential pkg-config libgtk-3-dev libx11-dev

# Опционально для дополнительных бекендов
sudo apt install libxkbcommon-dev libwayland-dev libcairo2-dev

🚀 Запуск примеров

Главное меню лаунчера (рекомендуется)

cargo run --bin main
# или
cargo run

Прямой запуск отдельных примеров

# Базовый интерактивный график с рисованием линий
cargo run --bin basic_interactive

# Продвинутые аннотации (указатели, текст, области)
cargo run --bin advanced_annotations

# Интерактивные измерения и crosshair
cargo run --bin interactive_measurements

# Система координат и события мыши
cargo run --bin coordinate_system

📋 Примеры

1. basic_interactive.rs

Базовый интерактивный график с рисованием линий

![Возможности]:

  • ✅ Рисование произвольных линий поверх графика
  • ✅ Автоматическое масштабирование всех элементов
  • ✅ Crosshair в режиме рисования
  • ✅ Переключение режимов (навигация/рисование)
  • ✅ Завершение линий правым кликом

Управление:

  • Включите "Режим рисования"
  • ЛКМ - добавить точку к линии
  • ПКМ - завершить текущую линию
  • Колесо мыши - масштабирование
  • Перетаскивание - панорамирование

2. advanced_annotations.rs

Продвинутые аннотации и указатели

![Возможности]:

  • ✅ Вертикальные и горизонтальные указатели
  • ✅ Текстовые аннотации с автопозиционированием
  • ✅ Выделение прямоугольных областей
  • ✅ Предпросмотр элементов в реальном времени
  • ✅ Легенда и статистика элементов

Режимы работы:

  • 📋 Навигация - обычное перемещение по графику
  • 📏 Вертикаль - добавление вертикальных линий
  • 📐 Горизонталь - добавление горизонтальных линий
  • 📝 Текст - добавление текстовых аннотаций
  • 🔲 Область - выделение прямоугольных областей

3. interactive_measurements.rs

Интерактивные измерения и crosshair

![Возможности]:

  • ✅ Crosshair с отображением координат
  • ✅ Измерительная линейка с расчетом расстояний
  • ✅ Snap к точкам данных
  • ✅ История измерений
  • ✅ Настраиваемые параметры snap

Особенности:

  • 🎯 Crosshair с координатами в реальном времени
  • 📏 Точные измерения расстояний и смещений
  • 🧲 Автоматическая привязка к ближайшим точкам данных
  • 📊 Детальная информация о каждом измерении

4. coordinate_system.rs

Система координат и события мыши

![Возможности]:

  • ✅ Подробная информация о системе координат
  • ✅ Преобразование между экранными и графическими координатами
  • ✅ История всех событий мыши
  • ✅ Интерактивная сетка координат
  • ✅ Перетаскиваемые демонстрационные точки

Демонстрирует:

  • 🔄 Преобразование координат в реальном времени
  • 📐 Адаптивная сетка координат
  • 🖱 Отслеживание всех типов событий мыши
  • 📍 Синхронизация между системами координат

🛠 Архитектурные особенности

Автоматическое масштабирование

Все элементы рисуются в координатах графика, поэтому автоматически масштабируются:

// Элементы остаются в тех же позициях в системе координат данных
let line = Line::new(PlotPoints::from(vec![[x1, y1], [x2, y2]]))
    .color(egui::Color32::RED)
    .width(2.0);
plot_ui.line(line);

Обработка событий мыши

if let Some(pointer_pos) = plot_ui.pointer_coordinate() {
    // pointer_pos автоматически в координатах графика
    if plot_ui.response().clicked() {
        // Обработка клика в координатах данных
    }
}

Система координат

// Получение границ графика
let bounds = plot_ui.plot_bounds();

// Преобразование координат
let screen_pos = plot_ui.screen_from_plot(plot_point);
let plot_pos = plot_ui.plot_from_screen(screen_point);

🎨 Возможности egui_plot для интерактивного рисования

✅ Что ОТЛИЧНО работает:

  • Рисование линий - Line с автоматическим масштабированием
  • Точки и маркеры - Points с различными формами
  • Текстовые аннотации - Text с позиционированием
  • Полигоны и области - Polygon для выделения областей
  • Координаты мыши - pointer_coordinate() в системе координат графика
  • Границы графика - plot_bounds() для динамических элементов
  • Преобразование координат - между экранными и графическими координатами

⚠️ Особенности:

  • Все элементы статичны после добавления (нет встроенного редактирования)
  • Интерактивность реализуется через обработку событий мыши
  • Производительность зависит от количества элементов

❌ Что НЕ поддерживается:

  • Встроенное редактирование элементов после создания
  • Drag&drop элементов без ручной реализации
  • Анимации (только через перерисовку)

🔧 Сборка и оптимизация

Режим разработки:

cargo run --bin basic_interactive

Оптимизированная сборка:

cargo build --release
./target/release/basic_interactive

Проверка кода:

cargo check
cargo clippy

📊 Сравнение с альтернативами

Решение Интерактивное рисование Автомасштабирование Ubuntu поддержка Сложность
egui_plot ✅ Отлично ✅ Автоматическое ✅ Полная 🟢 Простая
plotters-iced ⚠️ Ограниченное ❌ Ручное ✅ Полная 🟡 Средняя
plotters + GTK ❌ Нет ❌ Ручное ✅ Полная 🔴 Сложная
egui-plotter ⚠️ Базовое ✅ Частичное ✅ Полная 🟡 Средняя

💡 Рекомендации по использованию

Для интерактивного рисования поверх графиков:

egui_plot - лучший выбор благодаря:

  • Встроенной поддержке всех необходимых примитивов
  • Автоматическому масштабированию
  • Простому API для обработки событий мыши
  • Отличной производительности

Архитектурные принципы:

  1. Храните данные в координатах графика - автоматическое масштабирование
  2. Используйте pointer_coordinate() - координаты мыши в системе данных
  3. Обрабатывайте события через plot_ui.response() - полный контроль
  4. Разделяйте логику по режимам - удобство использования

Оптимизация производительности:

  • Группируйте элементы одного типа
  • Используйте PlotPoints::from() для больших наборов данных
  • Ограничивайте количество текстовых аннотаций
  • Кэшируйте вычисления координат

🤝 Вклад в развитие

Проект демонстрирует практические паттерны использования egui_plot для интерактивной визуализации данных в Rust. Все примеры тестировались на Ubuntu 22.04+ и показывают production-ready подходы к решению реальных задач.

About

Примеры реализации интерактировного графика с egui_plot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages