Search code examples
graphvizdot

How to reference/name specific part of a shape?


I want to reference a specific part of a shape. For example: From Best Apple to Basket 1, instead of apple_node to Basket 1. The below image will better explain what I wish to achieve.

https://i.sstatic.net/7qWec.jpg

This is my graphviz code and what I have achieved so far:

digraph fruits {

    node [shape=record]


    apple_node [label="Apple | {{Best Apple} | {Worst Apple}}"];
    banana_node [label="Banana | {{Best Banana} | {Worst Banana}}"];

    basket1_node [label="basket1|{Colour 10 | Seeds 10}"];
    basket2_node [label="basket2|{Colour 10 | Seeds 10}"];

    apple_node -> basket1_node;
    banana_node -> basket2_node;

}

Solution

  • Since you are using record-based nodes, you can add field id's to the label and use them as portnames which indicate where to attach an edge to (see also the official documentation about record-based nodes).

    Example:

    examplenode [shape=record; label="<fieldid1> one|<fieldid2> two"];
    examplenode:fieldid1 -> othernode;
    

    Your apple-banana example:

    digraph fruits {
        node [shape=record]
    
        apple_node [label="Apple | {{<bestapple>Best Apple} | {<worstapple>Worst Apple}}"];
        banana_node [label="Banana | {{Best Banana} | {<worstbanana>Worst Banana}}"];
    
        basket1_node [label="basket1|{Colour 10 | Seeds 10}"];
        basket2_node [label="basket2|{Colour 10 | Seeds 10}"];
    
        apple_node:bestapple -> basket1_node;
        apple_node:worstapple -> basket1_node;
        banana_node:worstbanana -> basket2_node;
    }