Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Graphviz: how to rotate a node (or a subgraph)?

I am trying to have a node (or a subgraph, enclosing a node - whichever is possible/easier) rotated, like shown in this image:

desired rotated node effect

(Note that it doesn't matter to me if the "B" label is rotated - only that the 'verti-*' texts in the record [or rather, the whole record node] are rotated as shown)

 

However, the closest I can to that, is the following dot code:

digraph graphname {
    node [fontname=Monospace, fontsize=14]; 
    subgraph clusterMasterBox {
        node [shape=record];
        l1 [label = "{ horiz-1 \r| \
 horiz-2 \r| \
 horiz-3 \r| \
 horiz-4 \r} \
"];
        subgraph clusterSubRotateBox {
            rotate=90;
            node [shape=record,rotate=90];
            l2 [label = "{ verti-1 \r| \
 verti-2 \r| \
 verti-3 \r| \
 verti-4 \r} \
"];     
            label="B";
        }
    label="A"
    }
}

The only reason I have the subgraph clusterSubRotateBox there (and the only reason why it is nested inside the clusterMasterBox), is because I hoped I could assign rotation to it, but apparently I cannot - as the above code generates this image:

gviz rotate actual

So my question is - is there a way to rotate a record node; if not on its own, then maybe as a part of subgraph (or a different kind of 'object')?

Thanks in advance for any suggestions,
Cheers!

like image 302
sdaau Avatar asked Dec 23 '10 00:12

sdaau


3 Answers

If you want to rotate a single record based node then rankdir will work. I tried it for my graph,

digraph plugnoid {
    rankdir=LR;
    node[shape=Mrecord];
    plugnoid [label="swarm| {<load0> onLoad|<plugin0> Plugin|<quit0> onQuit}|{<run0>run|<rehash0>rehash}"];}

enter image description here

The rankdir can have values LR,RL and TB(default). When I changed the rankdir to TB the output changed,

enter image description here

You may want to try them on your graph to get desired results. I experienced that when I used subgraph and set different rankdir the result was not as good. Please see http://www.graphviz.org/doc/info/shapes.html#record for more details.

like image 170
KRoy Avatar answered Nov 11 '22 10:11

KRoy


For a single node, there is the orientation attribute. I just used

node[shape=hexagon, orientation=30]

To make a hexagon with a point at the top rather than a flat top.

Unfortunately doesn't seem to work on 'record' types :-(

like image 41
dsz Avatar answered Nov 11 '22 10:11

dsz


there should be a "rotation" attribute on the graph object (see http://www.graphviz.org/doc/info/attrs.html#drotation) but it didn't do anything in my test. and, it would only apply to the whole graph (not cluster/subgraph) according to the docs. i guess you'd first render the subgraph to postscript and then include it in the final graph as a custom shape for a single placeholder node. if you can't get "rotation" to do its thing, surely postscript has a simple way to apply a transform (rotation in this case), probably as simple as prefixing the generated code with some coordinates definition. sorry for the handwaving but i don't have time to try it now.

like image 4
mwx Avatar answered Nov 11 '22 10:11

mwx