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,5061427




      3,5061427






















          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















































                     


                    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

                    Use pre created SQLite database for Android project in kotlin

                    Darth Vader #20

                    Ondo