Более

Создание маршрутизируемого графа из шейп-файла Point и Line с помощью Networkx?


У меня есть один шейп-файл, который состоит из всех улиц в исследуемой области, и другой шейп-файл, в котором есть точки, представляющие исходные и конечные пункты.

Можно ли найти кратчайший путь между всеми пунктами отправления и назначения, используя ссылки в шейп-файле ссылок?

Я в основном использую Python, Networkx и QGIS для своей работы, поэтому было бы здорово использовать эти инструменты для этой задачи.


Более сложная начальная проблема - это совместная регистрация данных точки с вашей сетью. Эти данные могли быть получены из разных источников, поэтому следует ожидать некоторой позиционной ошибки. В отсутствие более сложных правил, регулирующих расположение точек в сети, вы можете использовать ближайшую точку в сети к каждому источнику / месту назначения, как показано в этом существующем ответе. Задача здесь - найти ближайшее местоположение вдоль линии, а не только ближайшую вершину:

Выполнив этот шаг, у вас должна быть исходная сеть и новые совместно зарегистрированные точки. Оттуда вы можете использовать функцию nx_shp в NetworkX, чтобы импортировать шейп-файл в модель графа.

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


QGIS 1.8 имеет встроенный класс qgis.networkanalysis, в нем есть функции для привязки точек к линиям и вычисления кратчайшего пути.


Чтение shp с использованием networkx, у параллельных ребер отсутствуют атрибуты

Я пытаюсь использовать networkx.read_shp для создания MultiGraph из файла формы. Я понимаю, что функцию необходимо изменить, поскольку она обычно создает DiGraph, я пытаюсь сделать это:

Остальная часть функции остается прежней. При проверке eges я вижу, что при наличии параллельных ребер один из них, кажется, имеет пустой словарь вместо атрибутов (несмотря на то, что они присутствуют в шейп-файле). Я видел подобный вопрос раньше, но, похоже, он использует устаревшую версию networkx. Есть ли способ создать мультиграф с параллельными краями и их атрибутами? Я видел этот ответ NetworkX - Как создать MultiDiGraph из шейп-файла? но это для направленного, я могу попробовать преобразовать его позже, но если существует более прямое решение, оно будет оценено по достоинству.


TypeError: нехешируемый тип: & # 39LineString & # 39 при использовании ox.simplify_graph ()

У меня есть набор данных, из которого я построил граф, совместимый с NetworkX. Шейп-файл был преобразован в словари для узлов и ребер, которые затем были преобразованы в GeoDataFrame. С этого момента я использовал ox.graph_from_gdfs () для создания функционирующего графа. Граница GeoDataFrame выглядит примерно так (первая строка, упрощенная):

а узел GeoDataFrame выглядит так:

Преобразование их в MultiDiGraph не возвращает ошибок:

Те же данные также возвращаются при обратном преобразовании из графика в gdfs.

Однако при упрощении G возникает следующая ошибка:

Я предполагаю, что части данных в gdf_nodes и gdf_edges имеют неправильный формат или что-то отсутствует. Однако я не могу понять, что именно. Я не встречал никаких других ошибок с OSMnx, кроме использования этой функции.

Вот простой код для воспроизведения ошибки

Я подозреваю, что есть несколько дублированных узлов с разными идентификаторами (см. X, y для 111603 и 111604). Может, в этом проблема?


Сетевой анализ в Python¶

Поиск кратчайшего пути с использованием конкретной уличной сети - распространенная проблема ГИС, которая имеет множество практических приложений. Например, навигаторы - одно из тех «повседневных» приложений, в которых маршрутизация Использование специальных алгоритмов используется для поиска оптимального маршрута между двумя (или несколькими) точками.

Также возможно выполнить сетевой анализ, такой как маршрутизация транспонирования в Python. Networkx - это модуль Python, который предоставляет инструменты для анализа сетей различными способами. Он также содержит такие алгоритмы, как алгоритм Дейкстры или алгоритм A *, которые обычно используются для поиска кратчайших путей вдоль транспортной сети.

Чтобы иметь возможность проводить анализ сети, конечно, необходимо иметь сеть, которая используется для анализа. Пакет OSMnx, который мы только что изучили в предыдущем руководстве, действительно упрощает получение маршрутизируемых сетей из OpenStreetMap с различными видами транспорта (ходьба, езда на велосипеде и вождение). OSMnx также сочетает в себе некоторые функции модуля networkx, чтобы упростить выполнение маршрутизации по данным OpenStreetMap.

Затем мы протестируем функции маршрутизации OSMnx, найдя кратчайший путь между двумя точками на основе проезжих дорог. С небольшими изменениями можно также повторить анализ для пешеходной уличной сети.


Создание маршрутизируемого графа из шейп-файла Point и Line с помощью Networkx? - Географические информационные системы

Это один из 100+ бесплатных рецептов IPython Cookbook, Second Edition, написанного Сириллом Россантом, руководства по численным вычислениям и науке о данных в Jupyter Notebook. Электронную книгу и печатную книгу можно приобрести в Packt Publishing.

14.7. Создание планировщика маршрута для дорожной сети

В этом рецепте мы основываемся на нескольких методах, описанных в предыдущих рецептах, чтобы создать простой GPS-подобный планировщик маршрутов на Python. Мы получим данные о дорожной сети Калифорнии из Бюро переписи населения США, чтобы найти кратчайшие пути на графике дорожной сети. Это позволит нам отображать маршруты между любыми двумя точками Калифорнии.

Для этого рецепта вам понадобится Smopy. Вы можете установить его с помощью pip install git + https: //github.com/rossant/smopy. Чтобы NetworkX мог читать наборы данных Shapefile, вам также потребуется GDAL / OGR. Вы можете установить его с помощью conda install gdal.

На момент написания этой статьи gdal, похоже, плохо работал с conda и Python 3.6. Возможно, вам потребуется понизить версию Python до Python 3.5 с помощью conda install python = 3.5.

  1. Мы загружаем данные (набор данных Shapefile) с помощью NetworkX. Этот набор данных содержит подробную информацию о главных дорогах Калифорнии. Функция read_shp () NetworkX возвращает график, где каждый узел представляет собой географическое положение, а каждое ребро содержит информацию о дороге, соединяющей два узла. Данные поступают с веб-сайта Бюро переписи населения США http://www.census.gov/geo/maps-data/data/tiger.html.
  1. Этот граф не обязательно связан, но нам нужен связный граф для вычисления кратчайших путей. Здесь мы берем самый большой связный подграф с помощью функции connected_component_subgraphs ():
  1. Мы определяем две позиции (с широтой и долготой) и находим кратчайший путь между этими двумя позициями:
  1. Каждое ребро на графике содержит информацию о дороге, включая список точек на этой дороге. Сначала мы создаем функцию, которая возвращает этот массив координат для любого края графика:
  1. В частности, мы можем использовать путь дороги для вычисления его длины. Сначала нам нужно определить функцию, которая вычисляет расстояние между любыми двумя точками в географических координатах:
  1. Мы обновляем наш граф, вычисляя расстояние между любыми двумя соединенными узлами. Мы добавляем эту информацию с помощью атрибута расстояния краев:
  1. Последний шаг перед тем, как мы сможем найти кратчайший путь в графе, - это найти два узла в графе, которые наиболее близки к двум запрошенным позициям:
  1. Теперь мы используем функцию Shorttest_path () NetworkX для вычисления кратчайшего пути между нашими двумя позициями. Мы указываем, что вес каждого ребра равен длине дороги между ними:
  1. Маршрут рассчитан. Переменная path содержит список ребер, которые образуют кратчайший путь между двумя нашими позициями. Теперь мы можем получить информацию о маршруте с пандами. В наборе данных есть несколько интересующих полей, включая название и тип (штат, межгосударственный и т. Д.) Дорог:

Вот общая длина этого маршрута:

  1. Наш путь содержит связанные узлы в графе. Каждое ребро между двумя узлами характеризуется списком точек (составляющих часть дороги). Следовательно, нам нужно определить функцию, которая объединяет позиции вдоль каждого ребра в пути. Мы должны соединить позиции в правильном порядке на нашем пути. Мы выбираем порядок, исходя из того факта, что последняя точка на ребре должна быть близка к первой точке на следующем ребре:

Мы вычислили кратчайший путь с помощью функции Shorttest_path () в NetworkX. Здесь эта функция использовалась Алгоритм Дейкстры. Этот алгоритм имеет множество применений, например, в протоколах сетевой маршрутизации.

Есть разные способы вычисления географического расстояния между двумя точками. Здесь мы использовали относительно точную формулу: ортодромическое расстояние (также называемый расстояние по дуге), который предполагает, что Земля представляет собой идеальную сферу. Мы также могли бы использовать более простую формулу, поскольку расстояние между двумя последовательными точками на дороге невелико.

Вы можете найти дополнительную информацию о задачах кратчайшего пути и алгоритме Дейкстры в следующих ссылках:


Модули корпоративной совместной работы и мощные модули анализа журналов

Библиотека Java с открытым исходным кодом для сопоставления карт онлайн и офлайн с помощью OpenStreetMap. Вместе с обширным набором геометрических и пространственных функций, структурой данных карты в памяти и базовыми функциями машинного обучения он представляет собой универсальную основу для масштабируемых сервисов на основе местоположения и пространственно-временного анализа данных на карте. Он разработан для использования в параллельных и распределенных системах и, следовательно, включает в себя автономный сервер сопоставления карт и может использоваться в распределенных системах для служб сопоставления карт в облаке. Barefoot состоит из библиотеки программного обеспечения и (на основе Docker) картографического сервера, который обеспечивает доступ к данным карты улиц из OpenStreetMap и может использоваться в распределенных облачных инфраструктурах в качестве сервера картографических данных или параллельно с автономными серверами Barefoot. для автономного (сервер сопоставления) и сопоставления онлайн-карт (сервер отслеживания) или других приложений, созданных с помощью библиотеки Barefoot. Доступ к данным карты обеспечивается быстрой и гибкой структурой данных карты в памяти. Вместе с GeographicLib [1] и API геометрии ESRI [2] он предоставляет обширный набор географических и геометрических операций для анализа пространственных данных на карте.


Magellan - это распределенный механизм выполнения для геопространственной аналитики больших данных. Он реализован поверх Apache Spark и глубоко использует современные методы баз данных, такие как эффективная компоновка данных, генерация кода и оптимизация запросов для оптимизации геопространственных запросов. Разработчик приложения пишет стандартные запросы sql или фрейма данных для оценки геометрических выражений, в то время как механизм выполнения заботится об эффективном размещении данных в памяти во время обработки запроса, выборе правильного плана запроса, оптимизации выполнения запроса с помощью дешевых и эффективных пространственных индексов при представлении декларативная абстракция разработчику.

GoJS - это библиотека JavaScript и TypeScript для создания диаграмм, диаграмм и графиков и управления ими. GoJS - это гибкая библиотека, которую можно использовать для создания различных видов интерактивных диаграмм, включая визуализацию данных, инструменты рисования и редакторы графиков. Существуют образцы для блок-схемы, организационной диаграммы, BPMN бизнес-процесса, дорожек, временных шкал, диаграмм состояний, канбан, сети, карты разума, санки, генеалогических деревьев и диаграмм генограмм, диаграмм рыбьей кости, поэтажных планов, UML, деревьев решений, диаграмм соответствия, диаграммы Ганта и т. Д. и еще сотни. GoJS включает ряд встроенных макетов, включая древовидную, направленную по силе, радиальную и многоуровневую компоновку орграфа, а также ряд примеров пользовательской компоновки.


Отсутствующие секции и обратные движения в STMATCH # 70

Привет,
Я использую API-интерфейс python (скомпилированный в python3) и STMATCH.
Все выглядит многообещающе, однако я не получаю идеального совпадения данных: я получаю либо недостающие звенья, либо ненужные обратные движения (и / или и то, и другое).

Я создал отдельный пример поведения здесь:
https://github.com/cweber9843/test_fmm/blob/master/test_fmm_on_synthetic_data.ipynb
Включая изменение параметров и проверку сети.

  • Как лучше всего настроить параметры?
  • Может быть, построить вокруг них минимайзер? Какой-то градиентный поиск?
  • Как избежать обратных движений?
  • Как можно гарантировать подключенный матч?
  • Есть ли бумага для алгоритма STMATCH?
  • В документе FMM упоминается штраф за предотвращение обратного движения. Это все еще реализовано?
  • Будет ли FMM с предварительно рассчитанным файлом UBODT давать лучшие результаты?
  • Как выполняется визуализация сети (например, здесь: №30)? Это плагин QGis?
  • какие-нибудь другие подсказки?

Текст был успешно обновлен, но были обнаружены следующие ошибки:

В настоящее время мы не можем преобразовать задачу в проблему. Пожалуйста, попробуйте еще раз.

Проблема была успешно создана, но в настоящее время мы не можем обновить комментарий.

Cyang-kth прокомментировал 14 мая 2020 г., & # 8226

Лучшим способом было бы вручную пометить подмножество траекторий, а затем попробовать различные параметры для максимального повышения точности.

Обучение гиперпараметрам лучше проводить вне текущей программы.

Либо вы выполняете предварительную обработку, чтобы сгладить траекторию, чтобы удалить обратное движение (как в примере, который вы показываете), либо (фактически изменяете программу), это в основном вызвано предположением, что транспортное средство должно двигаться вдоль направления кромки. (Один из способов - добавить допуск на обратное движение)

Сопоставление не удается, если путь не может быть соединен (в этом примере, я думаю, вероятно, что некоторые границы сети могут быть направленными, а не двунаправленными).

Документ находится здесь https://dl.acm.org/doi/abs/10.1145/1653771.1653820
Лу И, Чжан Ц., Чжэн И и др. Сопоставление карт для траекторий GPS с низкой частотой дискретизации [C] // Труды 17-й международной конференции ACM SIGSPATIAL по достижениям в геоинформационных системах. 2009: 352-361.

FMM очень похож на этот, за исключением того, что используется предварительное вычисление.

  • В документе FMM упоминается штраф за предотвращение обратного движения. Это все еще реализовано?

Нет, это было удалено из текущей реализации, поскольку используется редко.

Я не думаю, что FMM и STMATCH следуют одному и тому же принципу, но один использует предварительные вычисления, а другой нет.

Это напрямую визуализируется в QGIS без внешнего плагина. Вы просто определяете символ направленной линии.

Я бы порекомендовал вам сначала взглянуть на сеть в QGIS. Какая-то его часть может не быть подключена.

Cweber9843 прокомментировал 14 мая 2020 г.

Спасибо за быстрый ответ!
Я только что понял, что моя проблема действительно может происходить из сети: чтобы получить направленные ссылки, я продублировал исходные координаты и обменял источник / цель, но фактически не меняя линию. Я предполагаю, что для истинно направленной сети мне придется изменить геометрию. Спасибо, что подтолкнули меня в правильном направлении!

Cweber9843 прокомментировал 14 мая 2020 г.

Еще раз спасибо за комментарии, проблема действительно была в сети. Теперь я перевернул каждую геометрию, и теперь сеть действительно двунаправленная, а не только пары источник-цель, поменяемые местами с одинаковым направлением в геометрии.

Теперь STMATCH надежно находит хорошие совпадения, есть небольшие обратные движения, и в моем тестовом образце я вижу только одно ложное совпадение. Алгоритм также менее чувствителен к параметрам.
Теперь я могу перейти к более реалистичным трассам и провести там больше тестов.

Cweber9843 прокомментировал 15 мая 2020 г.

Извините, еще один вопрос, и я снова открываю эту проблему, так как думаю, что она как-то связана с моей сетью, но я не вижу ошибки:
Когда я запускаю ваш пример записной книжки для STMATCH, я получаю те же результаты, что и пример, особенно я получаю результат для cpath.
Однако для моих собственных данных и сети я получаю только точечные данные, а не края:

Для зеленой линии на графике я ищу идентификаторы ребер в своей сети, но я думаю, что это создает некоторые артефакты, такие как нижний конец зеленой линии на рисунке выше.

У вас есть какие-нибудь подсказки, почему у меня нет cpath?
Я (пока) не создавал свой шейп-файл так, как вы описали, через postGIS, а скорее через геопанды и networkX.

Cyang-kth прокомментировал 15 мая 2020 г.

Причина того, что у вас есть opath, но пустой cpath, заключается в том, что есть две совпадающие точки, которые не подключены к сети.

Если вы действительно можете извлечь эту единственную траекторию в отдельный файл traj.csv, а затем запустить с уровнем журнала 0, то вы можете увидеть более подробный журнал процесса сопоставления карты, который может напечатать, что некоторые точки не связаны.

Файл журнала может содержать сотни тысяч строк, вы можете сначала экспортировать его в файл журнала, а затем проверить этот журнал.

Cweber9843 прокомментировал 19 мая 2020 г.

@ cyang-kth, еще раз спасибо за быстрый ответ.

Теперь я запустил stmatch из командной строки в сети и данных WGS84 (UTM32 выдал ошибку SQLite без такого столбца: Public_date - вы хотите получить отчет об этой ошибке? Python API работает независимо от CRS.).

Однако я не вижу дополнительной информации о том, какие точки не подключены:
Содержание stmatch.log:
[info] [stmatch_app_config.cpp: 48] Начать чтение конфигурации stmatch из аргументов [info] [stmatch_app_config.cpp: 105] Закончить с чтением конфигурации stmatch arg [информация] [stmatch_app_config.cpp: 109] ---- Распечатать конфигурацию - - [информация] [network_config.cpp: 6] NetworkConfig [информация] [network_config.cpp: 7] Имя файла: ./data/bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp [id] [info_config.cpp] [идентификатор] [info_config.cpp] [network_config.cpp: 9] Имя источника: источник [информация] [network_config.cpp: 10] Имя цели: цель [информация] [gps_config.cpp: 19] Формат GPS: точка CSV [информация] [gps_config.cpp: 20] Имя файла: ./data/syntetic_data_ANV_WGS84.csv [info] [gps_config.cpp: 21] Имя идентификатора: id [info] [gps_config.cpp: 22] x имя: x [информация] [gps_config.cpp: 23] y имя : y [информация] [gps_config.cpp: 24] Имя отметки времени: отметка времени [информация] [result_config.cpp: 30] ResultConfig [информация] [result_config.cpp: 31] Файл: mr.txt [info] [result_config.cpp: 32] Поля: opath cpath mgeom [информация] [stmatch_algorithm.c pp: 22] STMATCHAlgorithmConfig [информация] [stmatch_algorithm.cpp: 23] k 4 радиус 0,4 gps_error 0,5 vmax 80 фактор 1,5 [информация] [stmatch_app_config.cpp: 114] Трассировка уровня журнала 0 [информация] [stmatch_app_config.cpp: 115] Шаг 1 [информация] [stmatch_app_config.cpp: 116] Использовать omp false [info] [stmatch_app_config.cpp: 117] ---- Распечатать конфигурацию завершено ---- [предупреждение] [result_config.cpp: 167] Перезаписать существующий файл результатов mr.txt [информация] [network.cpp: 37] Прочитать сеть из файла ./data/bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp [информация] [network.cpp: 130] Количество ребер 60 узлов 28 [информация] [network.cpp: 131] Индекс поля: id 2 source 4 target 5 [info] [network.cpp: 134] Считывание сети выполнено. [info] [network_graph.cpp: 17] Построить граф из начала ребер сети [info] [network_graph.cpp: 30] Узлы графа 28 ребер 60 [информация] [network_graph.cpp: 31] Построить граф из конца ребер сети [info] [gps_reader.cpp: 239] Id index 0 x index 1 y index 2 time index 3 [info] [stmatch_app.cpp: 33] Шаг 1 отчета о проделанной работе [info] [stmatch_app.cpp: 35] Начать сопоставление траекторий [info] [stmatch_app.cpp: 64] Выполнить сопоставление карт в одном потоке [info] [stmatch_app.cpp: 67] Progress 0 [info] [stmatch_app.cpp: 81] Процесс MM завершен [info] [stmatch_app.cpp: 87] Время занимает 0,002 [info] [stmatch_app.cpp: 88] Время, затраченное на исключение ввода 0 [info] [stmatch_app.cpp: 89] Завершить сопоставление карты, общее количество очков 26 сопоставлено 0 [info] [stmatch_app.cpp: 91] Процент сопоставлений: 0 [info ] [stmatch_app.cpp: 92] Скорость сопоставления точек: 0 [info] [stmatch_app.cpp: 93] Скорость сопоставления точек (исключая ввод): -nan [info] [stmatch_app.cpp: 95] Время занимает 0,002
И mr.txt:
idopathcpathmgeom 12312150,12149,10902,10902,10902,10902,10902,11310,11309,11309,10122,10122,10122,10122,9381,9381,9381,9009,9764,9009,9009,9009,9009,9009,9009 , 9009LINESTRING ()

Я вполне уверен, что моя сеть теперь подключена и двунаправлена:

Цифры зеленого и красного цвета - это исходный и целевой узел соответственно, а числа черным цветом - идентификатор края. Все ребра двунаправленные, и все они кажутся связанными (например, узел 126 является источником для ребра 154, но является целью для 362). Я проверил это для всех краев в этом примере.
bike_centerline_v1_extract_ANVedges_source_target_rev_renamed_mini_WGS84.shp


Рецепт автоматического перехода от данных к тексту на слайдах Reveal.js

За последние несколько лет я время от времени экспериментировал с различными рецептами для создания текстовых отчетов из наборов табличных данных (плагины для электронных таблиц также начинают появляться с той же целью). С этим связано несколько проблем, в том числе:

  • определение того, какие данные или идеи вы хотите сообщить из своего набора данных
  • (автоматическое получение выводов)
  • построение подходящих предложений из данных
  • организация предложений в некую повествовательную структуру
  • чтобы предложения хорошо читались вместе.

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

В бизнес-контексте отчетность часто осуществляется через презентации Powerpoint. Слайды в презентации могут включать контент, извлеченный из шаблонной электронной таблицы, которая сама может автоматически создавать таблицы и диаграммы для такого повторного использования из нового набора данных. В этом случае рецепт может выглядеть примерно так:

В предыдущей паре сообщений наблюдатели из числа вас, возможно, заметили, что я изучаю пару компонентов для рецепта, который можно использовать для создания презентаций на основе браузера discover.js из 20%, на которые приходится 80%.

Набор данных, с которым я работал, представляет собой набор ежемесячных данных о расходах на прозрачность, предоставленных Советом острова Уайт. Последние выпуски имеют вид:

Итак, как намекалось ранее, можно использовать следующий вид процесса для автоматического создания слайд-шоу Show.js из записной книжки Jupyter с соответствующим образом настроенными ячейками слайдов (фактически, нормальными ячейками с соответствующим набором элементов метаданных), используемыми в качестве промежуточного представления. .

Вот пример слайд-шоу, основанный на данных за октябрь 2016 года. Обратите внимание, что на некоторых слайдах есть & # 8220subslides & # 8221, то есть слайды под их, поэтому следите за стрелками внизу слева, чтобы отслеживать, когда они & # 8217 доступны. Также обратите внимание, что прокрутка немного удачна и отсутствует & # 8211, в идеале новый слайд всегда будет прокручиваться вверх, а для фрагментов, вставленных в слайд по одному, слайд должен прокручиваться вниз, чтобы следовать за ними).

Структура презентации в общих чертах выглядит следующим образом:

Например, здесь & # 8217s сводный слайд о расходах по директоратам & # 8211, обратите внимание, что мы можем достаточно легко встраивать диаграммы. (Графики стилизованы с использованием морской, так что ряд альтернативных тем тривиально доступен). Отдельные предметы управления вносятся по одной, как фрагменты.

На следующем слайде сравниваются капитальные затраты в сравнении с расходами на выручку для конкретного управления с разбивкой по вид расходов (соответствующие слайды создаются для всех остальных дирекций). (Я также сделал разбивку по каждому управлению по зона обслуживания.)

Перечисленные предметы отсортированы по стоимости и вместе составляют не менее 80% затрат в соответствующей области. Также перечислены любые другие предметы, на которые приходится более 5% (?) Соответствующих затрат.

Обратите внимание, что слайды доступны в вниз с этого слайда, а не через сеть скользит по деке. Эта 1.5D структура означает, что мы можем добавить элемент гибкого повествовательного дизайна в презентацию, давая читателю возможность исследовать данные, но в ограниченном виде.

В этом случае я сгенерировал суб-слайды для каждого основного типа расходов, вносящих вклад в банки капитала и доходов, а затем добавил разбивку по основным поставщикам для этой области расходов.

Это всего лишь первый этап создания слайдов 1,5D из табличного набора данных. Эвристика Парето (80/20) используется, чтобы попытаться установить приоритеты для отображаемой информации, чтобы учесть 80% расходов в различных областях или другие важные вклады.

Многократное применение этого принципа позволяет нам определить основные области расходов, а затем и основных поставщиков в этих областях расходов.

Следующим шагом является рассмотрение других способов сегментирования и структурирования данных для создания отчетов, которые действительно могут быть полезны & # 8230

Если у вас есть идеи, дайте мне знать в комментариях или свяжитесь напрямую & # 8230

PS FWIW, должно быть достаточно легко запустить любой другой набор данных, который в целом выглядит как пример вверху, через тот же код, только с парой незначительных настроек & # 8230


Анимированная визуализация полета

Пока что для получения дополнительной информации мы рассматривали только статическую безжизненную графику с несколькими наведениями. Давайте создадим анимированную визуализацию, показывающую активные рейсы с течением времени между Мельбурном и Сиднеем в Австралии.

Документ SVG для этого типа графики состоит из текста, линий и кругов.

Динамические части - это время и элементы внутри полет group, и данные могут выглядеть примерно так:

Чтобы получить координату x для динамического времени, нам нужно создать шкалу времени для каждого рейса, которая сопоставляет время отправления и прибытия с положением x на нашей карте. Мы можем прокручивать наши данные в начале, добавляя объекты Date и шкалы, чтобы с ними было легче работать. Moment.js здесь очень помогает с синтаксическим анализом даты и манипулированием ею.

Теперь мы можем передать нашу изменяющуюся дату в xScale (), чтобы получить координату x для каждого полета.

Цикл рендеринга

Время отправления и прибытия округляется до 5 минут, поэтому мы можем просматривать наши данные с шагом 5 м от первого отправления до последнего прибытия.

Войти, обновить и выйти

D3 позволяет указывать преобразования и переходы элементов, когда:

  • Появляются новые точки данных (Enter)
  • Изменение существующих точек данных (обновление)
  • Существующие точки данных удалены (Выход)

Переходы

Приведенный выше код отображает кадр каждые 500 мс с шагом 5 минут:

  • Он обновляет время
  • Создает новую летную группу с кружком для каждого полета.
  • Обновляет координаты x / y текущих рейсов
  • Удаляет группы рейсов по прибытии

Это работает, но нам действительно нужен плавный переход между каждым из этих кадров. Мы можем добиться этого, создав переход для любого выбора D3 и предоставив функцию продолжительности и замедления перед установкой атрибутов или свойств стиля.

Например, давайте уменьшим непрозрачность при входе в летные группы.

Давайте отключим уходящие летные группы.

Добавьте плавный переход между точками x и y.

Мы также можем переключать время между 5-минутными приращениями, чтобы оно отображалось каждую минуту, а не каждые пять минут, используя функцию промежуточного кадра.


Смотреть видео: Tutorial Excel - 7. Grafice (October 2021).