Позволяет ли Bokeh узлы быть "любым хеш-объектом", как в Networkx? - PullRequest
0 голосов
/ 30 сентября 2019

Я построил график в Networkx и хочу использовать Bokeh для визуализации. У меня есть выбор начать с нуля в Bokeh и использовать их Edge и Node Renderers, или использовать функцию Bokeh from_networkx(). https://docs.bokeh.org/en/latest/docs/user_guide/graph.html#networkx-integration

Преимущество для меня в Networkx:

В NetworkX узлами может быть любой хешируемый объект, например, текстовая строка, изображение, объект XML, другой график,настраиваемый объект узла и т. д.

И для моей программы каждый узел является экземпляром класса Node. https://networkx.github.io/documentation/stable/tutorial.html#creating-a-graph

Я нашел в документации Bokeh:

Ключевой особенностью GraphRenderer является то, что он поддерживает отдельные вспомогательные GlyphRenderers для узлов графа и краев графа. Это позволяет настраивать узлы, изменяя свойство GraphRenderer для node_renderer.

https://docs.bokeh.org/en/latest/docs/user_guide/graph.html#edge-and-node-renderers

Это привело меня к

attr node_renderer тип недвижимости: Instance ( GlyphRenderer ) Экземпляр GlyphRenderer, содержащий XYGlyph, который будет отображаться как узлы графа.

https://docs.bokeh.org/en/latest/docs/reference/models/renderers.html#bokeh.models.renderers.GraphRenderer.node_renderer

Что привело меня к выяснению, что это значитиметь тип свойства Instance ( Glyph Renderer ) ...

class Instance(instance_type, default=None, help=None) Принимать значения, которые являются экземплярами HasProps.

https://docs.bokeh.org/en/latest/docs/reference/core/properties.html#bokeh.core.properties.Instance

А потом я попытался понять, что означает class HasProps и как каждая из вышеперечисленных вещей связана ...

class HasProps(**properties) Базовый класс для всех типов классов, имеющих свойства Bokeh.

https://docs.bokeh.org/en/latest/docs/reference/core/has_props.html#bokeh.core.has_props.HasProps

Может кто-нибудь объяснить, как эти вещи работают вместе, и выяснить, что можно или нельзя использовать в качестве node_renderer в Боке? Я не разбираюсь во всех рабочих частях.

Кроме того, есть ли преимущество интеграции Networkx с Bokeh или использования только Bokeh?

ПРИМЕЧАНИЕ. Я новичок в Networkx иплод в боке.

1 Ответ

0 голосов
/ 01 октября 2019

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

Для контекста

node_renderer = Instance(GlyphRenderer) 

означает, что node_renderer принимает значения, которые являются экземплярами типа GlyphRenderer, а GlyphRenderer - это вещь, которая знает, как рисовать глифы (т.е. штрихи, круги и т. Д.) На экране. Это примерно так же далеко внизу базы кода, как я ожидаю, что кому-то когда-либо понадобится, если только не будет разработка самого Bokeh или создание собственных расширений.

Графики Боке рисуют глифы, вытягивая данные из связанного ColumnDataSource. CDS - это дешевая версия Pandas DataFrame. Это (более или менее) диктат, который отображает имена строковых столбцов в последовательности (списки, массивы, серии) данных. Обычно данные являются числами, а в случае категориальных координат или значений цвета - строками. Иногда для специальных символов, таких как multi_line или patches, столбцы больше похожи на «списки списков» чисел.

Когда вы добавляете данные атрибута в график NetworkX, Bokeh пытается поместить данные атрибута в один из этих столбцов CDS. Я почти уверен, что сложные значения атрибутов, такие как dicts и т. Д. Не будут работать. Такие вещи, как объекты или классы, безусловно, не будут работать, и причина в том, что все эти данные должны в конечном итоге быть сериализованы и отправлены в браузер для использования библиотекой JavaScript (BokehJS), и она не будет знать, что делать с чем-токак это.

TLDR;Я бы ожидал, что скалярные типы, такие как числа и строки будут работать, а также, возможно, списки из них.

...