Этот проект демонстрирует возможности создания интерактивных графиков в Rust с использованием библиотеки egui_plot
. Все примеры поддерживают 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
Базовый интерактивный график с рисованием линий
![Возможности]:
- ✅ Рисование произвольных линий поверх графика
- ✅ Автоматическое масштабирование всех элементов
- ✅ Crosshair в режиме рисования
- ✅ Переключение режимов (навигация/рисование)
- ✅ Завершение линий правым кликом
Управление:
- Включите "Режим рисования"
- ЛКМ - добавить точку к линии
- ПКМ - завершить текущую линию
- Колесо мыши - масштабирование
- Перетаскивание - панорамирование
Продвинутые аннотации и указатели
![Возможности]:
- ✅ Вертикальные и горизонтальные указатели
- ✅ Текстовые аннотации с автопозиционированием
- ✅ Выделение прямоугольных областей
- ✅ Предпросмотр элементов в реальном времени
- ✅ Легенда и статистика элементов
Режимы работы:
- 📋 Навигация - обычное перемещение по графику
- 📏 Вертикаль - добавление вертикальных линий
- 📐 Горизонталь - добавление горизонтальных линий
- 📝 Текст - добавление текстовых аннотаций
- 🔲 Область - выделение прямоугольных областей
Интерактивные измерения и crosshair
![Возможности]:
- ✅ Crosshair с отображением координат
- ✅ Измерительная линейка с расчетом расстояний
- ✅ Snap к точкам данных
- ✅ История измерений
- ✅ Настраиваемые параметры snap
Особенности:
- 🎯 Crosshair с координатами в реальном времени
- 📏 Точные измерения расстояний и смещений
- 🧲 Автоматическая привязка к ближайшим точкам данных
- 📊 Детальная информация о каждом измерении
Система координат и события мыши
![Возможности]:
- ✅ Подробная информация о системе координат
- ✅ Преобразование между экранными и графическими координатами
- ✅ История всех событий мыши
- ✅ Интерактивная сетка координат
- ✅ Перетаскиваемые демонстрационные точки
Демонстрирует:
- 🔄 Преобразование координат в реальном времени
- 📐 Адаптивная сетка координат
- 🖱 Отслеживание всех типов событий мыши
- 📍 Синхронизация между системами координат
Все элементы рисуются в координатах графика, поэтому автоматически масштабируются:
// Элементы остаются в тех же позициях в системе координат данных
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);
- Рисование линий -
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 для обработки событий мыши
- Отличной производительности
- Храните данные в координатах графика - автоматическое масштабирование
- Используйте
pointer_coordinate()
- координаты мыши в системе данных - Обрабатывайте события через
plot_ui.response()
- полный контроль - Разделяйте логику по режимам - удобство использования
- Группируйте элементы одного типа
- Используйте
PlotPoints::from()
для больших наборов данных - Ограничивайте количество текстовых аннотаций
- Кэшируйте вычисления координат
Проект демонстрирует практические паттерны использования egui_plot для интерактивной визуализации данных в Rust. Все примеры тестировались на Ubuntu 22.04+ и показывают production-ready подходы к решению реальных задач.