Вопрос

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

Дана следующая структура данных.

я, ты, 7 | я, яблоко, 9 | яблоко, ты, 1 | велосипед, я, 5

Имена будут отображаться горизонтально, имена с наибольшим количеством связей больше, чем у остальных, а затем между именами будут взвешенные дуги.Арка весом 10 кг была бы в два раза толще арки весом 5 кг.

Вдохновение приходит от:подобные диверсии. http://similardiversity.net/

Пусть испытание начнется!

Это было полезно?

Решение

Существует несколько библиотек, по крайней мере одна из которых опирается на Matplotlib, которые будут делать то, что вы хотите.Я рекомендую Networkx (www.networkx.lanl.gov) для построения вашей графической структуры, которую вы затем можете использовать для вызова соответствующих методов Matplotlib для построения графика.Networkx и Matplotlib очень хорошо работают вместе.

import networkx as NX
import matplotlib.pyplot as PLT
Gh = NX.Graph()
Gh.add_edge("You", "Bike", weight=1.0)
Gh.add_edge("Bike", "Apple", weight=0.9)
Gh.add_edge("Me", "Bike", weight=1.1)
all_nodes = Gh.nodes()
# to scale node size with degree:
scaled_node_size = lambda(node) : NX.degree(Gh, node) * 700
position = NX.spring_layout(Gh)    # just choose a layout scheme
NX.draw_networkx_nodes(Gh, position, node_size=map(scaled_node_size, all_nodes))
NX.draw_network_edges(Gh, position, Gh.edges(), width=1.0, alpha=1.0, edge_color="red")
# now for the Matplotlib part:
PLT.axis("off")
PLT.show()

Как вы можете видеть, вы могли бы масштабировать ребра, применив коэффициент для изменения параметра 'weight' к любому из методов 'edge', точно так же, как я сделал это для масштабирования узла.

Я бы также рекомендовал pygraphviz (очевидно, используя graphviz в качестве своего бэкэнда).Он очень похож на Netwworkx (тот же ведущий разработчик).

Другие советы

matplotlib это неподходящая библиотека, поскольку это не графическая библиотека общего назначения.То, что вам здесь нужно, это либо что-то вроде Каир, или гораздо проще, вы можете обойтись графическими возможностями любого GUI toolkit, такого как PyQt.Другим возможным подходом является PyGame, который также обладает хорошими возможностями рисования.

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

Я действительно не вижу, в чем заключается трудность или вызов.Все, что вам нужно, - это графическая библиотека, которая может рисовать текст и полукруги, что возможно практически во всем.Нет необходимости в кривых Безье.Например, вы могли бы просто создать SVG-файл (тогда вам даже не нужна никакая библиотека, и вы можете легко встроить это на веб-страницу и использовать некоторый JavaScript, чтобы сделать его интерактивным).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top