Pergunta

Este é um desafio inforgraphic muito específico altough a questão fundemental é como você construir arcos entre as palavras usando matplotlib, cario ou um outro libary python.

Dada a seguinte estrutura de dados.

eu, você, 7 | me, maçã, 9 | maçã, você, 1 | bicicleta, me, 5

Nomes seria exibido horizontalmente os nomes com mais relações maiores do que os outros e, em seguida, haveria ponderada arcos entre os nomes. Um arco de ponderação 10 seria duas vezes mais espessa como um arco ponderada 5.

A inspiração vem de: diverstiy similar. http://similardiversity.net/

Vamos dar o início challange!

Foi útil?

Solução

Existem várias bibliotecas, pelo menos um dos que se baseia em Matplotlib, que irá fazer o que quiser. Eu recomendo NetworkX (www.networkx.lanl.gov) para construir sua estrutura de gráfico, e que você pode usar para chamar os métodos matplotlib relevantes para traçar. NetworkX e Matplotlib funcionam muito bem juntos.

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()

Como você pode ver, você pode escalar as bordas através da aplicação de um fator de variar o parâmetro 'peso' para qualquer um dos métodos 'Edge', da mesma maneira que eu fiz isso para o nó de escala.

Eu também recomendaria pygraphviz (obviamente usando graphviz como seu backend). É muito semelhante ao Netwworkx (mesmo desenvolvedor de chumbo).

Outras dicas

matplotlib não é a biblioteca aqui, já que não é uma biblioteca de propósito gráficos em geral. O que você precisa aqui é ou algo como Cairo , ou muito mais simples, você pode fazer com os recursos gráficos de qualquer conjunto de ferramentas GUI, tais como PyQt. Outra abordagem possível é PyGame, que tem boas capacidades de desenho também.

Se você quiser um exemplo, consulte este href="http://www.cairographics.org/samples/" rel="nofollow página amostras Cairo , a primeira amostra - arc. Você acabou de escrever as palavras de texto e, em seguida, utilizar o código de arco para um arco de qualquer largura e cor entre eles.

Eu realmente não vejo onde a dificuldade ou desafio é. Tudo que você precisa é uma biblioteca de gráficos que pode desenhar texto e meios círculos, o que é possível em praticamente tudo. Não há necessidade de curvas de Bezier. Por exemplo, você poderia simplesmente criar um arquivo SVG (então você não precisa nem de qualquer biblioteca e pode muito bem incorporar isso em uma página web e usar algum JavaScript para torná-lo interativo).

A plotagem real é simples: o centro de um círculo está no meio entre as duas palavras, o raio é metade da distância entre eles. Você pode então ajustar o curso para refletir outras quantidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top