2009-11-05 4 views
4

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

С учетом следующей структуры данных.

me, you, 7 | меня, яблоко, 9 | apple, you, 1 | bike, me, 5

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

Вдохновение происходит от: аналогичного диверсия. http://similardiversity.net/

Позвольте заданию начать!

+0

Это интересная идея. Вам нужно, чтобы он был основан на векторе для масштабирования/печати или выполнял бы растровые изображения? Я боюсь, что на этот раз Matplotlib будет немного тяжело перемещаться, чтобы делать такой график. – RedGlyph

+0

На основе векторного было бы лучше всего я думаю. Да, это похоже на работу для карио. Перемещено за пределы мира математического построения диаграмм. Любая идея о том, как работать с текстом и кривыми/арками Безье, чтобы получить этот эффект? –

ответ

1

Существует несколько библиотек, по крайней мере один из которых основан на 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() 

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

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

0

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

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

+0

Я предполагаю, что я искал информацию о том, какие пакеты рекомендуют людям и какие функции лучше всего использовать. Это не сложно, но найти лучший пакет, и правильная функция ... –

+0

@Matt: Я думаю, что для этого нет «лучшей» библиотеки, потому что задача не является особенной.Чтобы решить, какой из них лучше всего подходит для вашего случая, нам потребуется дополнительная информация о ваших требованиях (например, если это кросс-платформенный, интерактивный, интегрированный в графический интерфейс, ...). Я, вероятно, поеду SVG, но это только я. – nikow

4

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

Если вы хотите найти пример, см. Эту страницу Cairo samples, первый образец - дугу. Вы просто пишете текстовые слова, а затем используйте дуговой код для дуги любой ширины и цвета между ними.

+0

+1: Каир - хороший инструмент для этого. – tom10