Plotting multigraphs with NetworkX/PyGraphviz: fine tuning node/edge position
up vote
0
down vote
favorite
I'd like to use NetworkX to more-or-less reproduce the following figure (from F. Crick, Nature 227, 561 (1970)):
I can reproduce the underlying graph using MultiDiGraph
:
import networkx as nx
g = nx.MultiDiGraph()
weakEdges = [('RNA', 'DNA'), ('RNA', 'RNA'), ('RNA', 'protein')]
strongEdges = [('DNA', 'DNA'), ('DNA', 'RNA'), ('DNA', 'protein')]
g.add_edges_from(weakEdges)
g.add_edges_from(strongEdges)
but apparently the built-in matplotlib plotting doesn't support parallel edges, as is needed for proper multigraphs.
On the other hand, I can convert g
to a PyGraphviz AGraph
and plot that:
a = nx.nx_agraph.to_agraph(g)
for etup in weakEdges:
a.get_edge(*etup).attr['style'] = 'dashed'
a.draw('test2.png', prog='circo')
This is pretty close to what I want, but I'm having trouble figuring out some of the finer details:
Using the
circo
layout, is it possible to center the "DNA" node at the top of the figure? If not, how can I control the absolute position of each node?How do I tweak the positioning of the self-edges (eg the "DNA" -> "DNA" edge) so that they more closely resemble those in the original figure?
python networkx graph-theory graphviz pygraphviz
add a comment |
up vote
0
down vote
favorite
I'd like to use NetworkX to more-or-less reproduce the following figure (from F. Crick, Nature 227, 561 (1970)):
I can reproduce the underlying graph using MultiDiGraph
:
import networkx as nx
g = nx.MultiDiGraph()
weakEdges = [('RNA', 'DNA'), ('RNA', 'RNA'), ('RNA', 'protein')]
strongEdges = [('DNA', 'DNA'), ('DNA', 'RNA'), ('DNA', 'protein')]
g.add_edges_from(weakEdges)
g.add_edges_from(strongEdges)
but apparently the built-in matplotlib plotting doesn't support parallel edges, as is needed for proper multigraphs.
On the other hand, I can convert g
to a PyGraphviz AGraph
and plot that:
a = nx.nx_agraph.to_agraph(g)
for etup in weakEdges:
a.get_edge(*etup).attr['style'] = 'dashed'
a.draw('test2.png', prog='circo')
This is pretty close to what I want, but I'm having trouble figuring out some of the finer details:
Using the
circo
layout, is it possible to center the "DNA" node at the top of the figure? If not, how can I control the absolute position of each node?How do I tweak the positioning of the self-edges (eg the "DNA" -> "DNA" edge) so that they more closely resemble those in the original figure?
python networkx graph-theory graphviz pygraphviz
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I'd like to use NetworkX to more-or-less reproduce the following figure (from F. Crick, Nature 227, 561 (1970)):
I can reproduce the underlying graph using MultiDiGraph
:
import networkx as nx
g = nx.MultiDiGraph()
weakEdges = [('RNA', 'DNA'), ('RNA', 'RNA'), ('RNA', 'protein')]
strongEdges = [('DNA', 'DNA'), ('DNA', 'RNA'), ('DNA', 'protein')]
g.add_edges_from(weakEdges)
g.add_edges_from(strongEdges)
but apparently the built-in matplotlib plotting doesn't support parallel edges, as is needed for proper multigraphs.
On the other hand, I can convert g
to a PyGraphviz AGraph
and plot that:
a = nx.nx_agraph.to_agraph(g)
for etup in weakEdges:
a.get_edge(*etup).attr['style'] = 'dashed'
a.draw('test2.png', prog='circo')
This is pretty close to what I want, but I'm having trouble figuring out some of the finer details:
Using the
circo
layout, is it possible to center the "DNA" node at the top of the figure? If not, how can I control the absolute position of each node?How do I tweak the positioning of the self-edges (eg the "DNA" -> "DNA" edge) so that they more closely resemble those in the original figure?
python networkx graph-theory graphviz pygraphviz
I'd like to use NetworkX to more-or-less reproduce the following figure (from F. Crick, Nature 227, 561 (1970)):
I can reproduce the underlying graph using MultiDiGraph
:
import networkx as nx
g = nx.MultiDiGraph()
weakEdges = [('RNA', 'DNA'), ('RNA', 'RNA'), ('RNA', 'protein')]
strongEdges = [('DNA', 'DNA'), ('DNA', 'RNA'), ('DNA', 'protein')]
g.add_edges_from(weakEdges)
g.add_edges_from(strongEdges)
but apparently the built-in matplotlib plotting doesn't support parallel edges, as is needed for proper multigraphs.
On the other hand, I can convert g
to a PyGraphviz AGraph
and plot that:
a = nx.nx_agraph.to_agraph(g)
for etup in weakEdges:
a.get_edge(*etup).attr['style'] = 'dashed'
a.draw('test2.png', prog='circo')
This is pretty close to what I want, but I'm having trouble figuring out some of the finer details:
Using the
circo
layout, is it possible to center the "DNA" node at the top of the figure? If not, how can I control the absolute position of each node?How do I tweak the positioning of the self-edges (eg the "DNA" -> "DNA" edge) so that they more closely resemble those in the original figure?
python networkx graph-theory graphviz pygraphviz
python networkx graph-theory graphviz pygraphviz
asked Nov 10 at 0:02
tel
3,5061427
3,5061427
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
A small setup in plain Graphviz / dot syntax (feed it to http://www.webgraphviz.com/ and one can see the result):
digraph X
rank=same; RNA Protein
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
Basic parts are here:
:n
place to get the array at (other possibilities are other wind directions including e.g.:nw
).rank=same;
to align the mentioned nodes in one line
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
A small setup in plain Graphviz / dot syntax (feed it to http://www.webgraphviz.com/ and one can see the result):
digraph X
rank=same; RNA Protein
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
Basic parts are here:
:n
place to get the array at (other possibilities are other wind directions including e.g.:nw
).rank=same;
to align the mentioned nodes in one line
add a comment |
up vote
0
down vote
A small setup in plain Graphviz / dot syntax (feed it to http://www.webgraphviz.com/ and one can see the result):
digraph X
rank=same; RNA Protein
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
Basic parts are here:
:n
place to get the array at (other possibilities are other wind directions including e.g.:nw
).rank=same;
to align the mentioned nodes in one line
add a comment |
up vote
0
down vote
up vote
0
down vote
A small setup in plain Graphviz / dot syntax (feed it to http://www.webgraphviz.com/ and one can see the result):
digraph X
rank=same; RNA Protein
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
Basic parts are here:
:n
place to get the array at (other possibilities are other wind directions including e.g.:nw
).rank=same;
to align the mentioned nodes in one line
A small setup in plain Graphviz / dot syntax (feed it to http://www.webgraphviz.com/ and one can see the result):
digraph X
rank=same; RNA Protein
DNA -> RNA
DNA -> Protein
Protein -> RNA
DNA:n -> DNA:n
Basic parts are here:
:n
place to get the array at (other possibilities are other wind directions including e.g.:nw
).rank=same;
to align the mentioned nodes in one line
answered Nov 10 at 9:57
albert
2,68721021
2,68721021
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53234817%2fplotting-multigraphs-with-networkx-pygraphviz-fine-tuning-node-edge-position%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown