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



enter image description here



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


enter image description here



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?











share|improve this question


























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



    enter image description here



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


    enter image description here



    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?











    share|improve this question
























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



      enter image description here



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


      enter image description here



      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?











      share|improve this question













      I'd like to use NetworkX to more-or-less reproduce the following figure (from F. Crick, Nature 227, 561 (1970)):



      enter image description here



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


      enter image description here



      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 10 at 0:02









      tel

      3,5611428




      3,5611428
























          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






          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            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

























            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






            share|improve this answer

























              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






              share|improve this answer























                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






                share|improve this answer












                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







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 10 at 9:57









                albert

                2,68721021




                2,68721021






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    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





















































                    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







                    Popular posts from this blog

                    Schultheiß

                    Verwaltungsgliederung Dänemarks

                    Liste der Kulturdenkmale in Wilsdruff