Horizontally align subgraph nodes

Greetings,

I have the following diagram where the nodes are aligned in LR.

The question would be if it is possible to align the nodes belonging to a subgraph in a Top-Botton way? As shown in the example?

Example file in dot format:
Output.dot (12.5 KB)

Here is an example of the diagram without debug option LR:

Here is an example of the diagram without debug option TB:

Regards,

Are you asking for a “one-time” solution, based on “tweaks” to Output.dot, or a more general-purpose solution that can be used for many inputs?
[Your Output.dot file appears to have been programmatically generated. A general-purpose fix would be very difficult]

Sorry for the lack of detail,

Actually this diagram is created programmatically using powershell.

But any ideas that come up will be of great help. I have tried to play with multiple values like rank, invisible nodes etc… but of all the challenges I have faced, I still haven’t found a solution for the horizontal nodes.

Thanks!

There seem to be two parts to this challenge:

  • place the html-nodes left-and-right (easier of the two)
  • place (center) the “Dummy” nodes above the html-nodes (more difficult)

To accomplish both tasks, the graph below:

  • combines pairs of html-nodes into a single node (adding ports)
  • encapsulates the “Dummy” nodes in new clusters
  • removes the invisible “container” nodes
digraph VeeamVBR {
	graph [bb="0,0,1114.8,1475",
		compound=true,
		fontcolor="#005f4b",
		fontname="Segoe Ui Black",
		fontsize=32,
		imagepath="C:\Users\jocolon\Documents\WindowsPowerShell\Modules\Veeam.Diagrammer\icons",
		labelloc=t,
		nodesep=0.6,
		overlap=false,
		pad=1,
		penwidth=1.5,
		rankdir=LR,
		ranksep=0.75,
		splines=polyline,
		style=dashed
	];
	node [fillcolor=white,
		fontsize=14,
		imagescale=True,
		label="",
		labelloc=t,
		shape=none,
		style=filled
	];
	edge [arrowsize=1,
		arrowtail=dot,
		color="#71797E",
		dir=both,
		penwidth=1.5,
		style=dashed
	];
	subgraph clusterMainGraph {
		graph [bb="8,8,1106.8,1467",
			fontsize=24,
			label=<<TABLE border='0' cellborder='0' cellspacing='20' cellpadding='10'>
        <TR>
            <TD bgcolor='#FFCCCC' ALIGN='center' colspan='1'>Veeam Logo</TD>
        </TR>
        <TR>
            <TD bgcolor='#FFCCCC' ALIGN='center'>Physical Infrastructure Diagram</TD></TR><TR><TD ALIGN='center'><font color='red'>Debug ON</font></TD>
        </TR>
        </TABLE>>,
			lheight=3.35,
			lp="557.38,1342.4",
			lwidth=5.75,
			penwidth=0
		];
		subgraph clusterBackupServer {
			graph [bb="16,548,512.25,832",
				bgcolor="#ceedc4",
				fontsize=18,
				label="Backup Server",
				lheight=0.33,
				lp="264.12,816",
				lwidth=1.69,
				penwidth=2,
				style=rounded
			];
			{
				graph [rank=same];
				"VEEAM-SQL"	[fillcolor="#ceedc4",
					height=1.0139,
					label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'><TR><TD ALIGN='Center' colspan='1'></TD></TR><TR><TD align='Center'><B>VEEAM-SQL</B></TD></TR><TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>IP: 192.168.7.79</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Role: Database Server</FONT></TD></TR></TABLE>>,
					pos="119.38,709",
					shape=plain,
					width=1.8576];
				"VEEAM-EM"	[fillcolor="#ceedc4",
					height=1.0139,
					label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'><TR><TD ALIGN='Center' colspan='1'></TD></TR><TR><TD align='Center'><B>VEEAM-EM</B></TD></TR><TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>IP: 192.168.7.83</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Role: Enterprise Manager Server</FONT></TD></TR></TABLE>>,
					pos="119.38,593",
					shape=plain,
					width=2.6493];
			}
			BackupServer	[height=0.05,
				pos="119.38,790",
				shape=point,
				style=invis,
				width=0.05];
			"VEEAM-VBR"	[fillcolor="#ceedc4",
				height=1.3021,
				label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'><TR><TD ALIGN='Center' colspan='1'></TD></TR><TR><TD align='Center'><B>VEEAM-VBR</B></TD></TR><TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>IP: 192.168.7.73</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Role: Backup Server</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Version: 12.1.0.2131</FONT></TD></TR></TABLE>>,
				pos="441.5,656",
				shape=plain,
				width=1.7431];
			"VEEAM-SQL" -> "VEEAM-VBR"	[arrowhead=normal,
				arrowtail=normal,
				minlen=3,
				pos="s,185.93,698.15 e,378.83,666.21 197.85,696.17 249.29,687.66 316.4,676.55 367,668.17",
				xlabel="1433/TCP",
				xlp="253.55,674.3"];
			"VEEAM-EM" -> "VEEAM-VBR"	[arrowhead=normal,
				arrowtail=normal,
				minlen=3,
				pos="s,214.69,611.56 e,379.16,643.93 226.7,613.92 272.78,622.99 325.58,633.38 367.18,641.57"];
		}
		subgraph clusterMainSubGraph {
			graph [bb="660.25,16,1098.8,1210",
				color=red,
				fontsize=22,
				label="Protected Groups",
				labelloc=t,
				lheight=0.42,
				lp="879.5,1191",
				lwidth=2.52,
				penwidth=1,
				style="dashed,rounded"
			];
			subgraph clusterADContainer {
				graph [bb="724.38,24,1090.8,342",
					fontsize=18,
					label="Active Directory Computers",
					labelloc=t,
					lheight=0.33,
					lp="907.56,326",
					lwidth=3.30,
					penwidth=1.5,
					style="dashed,rounded"
				];

   subgraph clusterXX1{ label="" peripheries=0
				DummyADContainer	[color=red,
					height=0.21875,
					label=DummyADC,
					pos="769.12,245",
					shape=plain,
					style=dashed,
					width=1.0208];
}
//				"SERVER WITH NETAPP LUNS "
ACTIVE	[fontname="Segoe Ui",
					height=1.5694,
					label=<
<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'>
<TR><TD PORT="P1"></TD><TD></TD><TD PORT="P2"></TD></TR>
<TR><TD align='Center' ><B>SERVER WITH NETAPP LUNS</B></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center'><B>GURABO PC - BACKUP</B></TD></TR>
<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Daily</FONT></TD> <TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Periodically</FONT></TD></TR>
<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD> <TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD></TR>
<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT></TD> <TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT></TD></TR>
</TABLE>>,
					pos="973.38,245",
					width=3.0382];


/****** what is this for?  (they mess up the edges)
				ADContainer	[height=0.05,
					pos="769.12,299",
					shape=point,
					style=invis,
					width=0.05];
*******/



				DummyADContainer -> ACTIVE:P1  [
  					color=red,
					minlen=0  //1,
					pos="s,779.47,237.24 e,893.9,145.48 786.7,231.23 813.65,208.84 864,167 864,167 864,167 872.22,161.08 884.14,152.5",
					style=filled];


				DummyADContainer ->  ACTIVE:P2 [ color=red,
					minlen=0  //1,
					pos="s,805.82,245 e,864.11,245 815.12,245 826.37,245 838.97,245 852.02,245",
					style=filled];
			}
			subgraph clusterICContainer {
				graph [bb="731.88,676,1088.1,994",
					fontsize=18,
					label="Individial Computers",
					labelloc=t,
					lheight=0.33,
					lp="910,978",
					lwidth=2.49,
					penwidth=1.5,
					style="dashed,rounded"
				];
/********  what is this for?
				ICContainer	[height=0.05,
					pos="769.12,873",
					shape=point,
					style=invis,
					width=0.05];
**************/
   subgraph clusterXX2{ label="" peripheries=0
				DummyICContainer	[color=red,
					height=0.21875,
					label=DummyIC,
					pos="769.12,741",
					shape=plain,
					style=dashed,
					width=0.8125];
}
//				"LINUX PROTECTION GROUP "	[fontname="Segoe Ui",
				LPG	[fontname="Segoe Ui",
					height=1.5694,
					label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'>
<TR><TD ALIGN='Center' colspan='1' PORT="P1"></TD><TD></TD><TD ALIGN='Center' colspan='1' PORT="P2"></TD></TR>
<TR><TD align='Center'><B>LINUX PROTECTION GROUP</B></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center'><B>MANUALLY ADDED</B></TD></TR>
<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Daily</FONT></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Daily</FONT></TD></TR> 

<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD></TR> 

<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: ManuallyAdded</FONT></TD></TR>
</TABLE>>,
					pos="973.38,741",
					width=2.9653];


				DummyICContainer -> LPG:P1	[color=red,
					minlen=0  //1,
					pos="s,798.25,741 e,866.88,741 807.74,741 821.52,741 837.94,741 855,741",
					style=filled];

				DummyICContainer -> LPG:P2	[color=red,
					minlen=0  //1,
					pos="s,779.47,748.76 e,893.9,840.52 786.7,754.77 813.65,777.16 864,819 864,819 864,819 872.22,824.92 884.14,833.5",
					style=filled];
			}
			subgraph clusterMCContainer {
				graph [bb="728.12,350,1071.2,668",
					fontsize=18,
					label="Manual Computers",
					labelloc=t,
					lheight=0.33,
					lp="899.69,652",
					lwidth=2.27,
					penwidth=1.5,
					style="dashed,rounded"
				];
/****** what is this for?  (they mess up the edges)
				MCContainer	[height=0.05,
					pos="769.12,625",
					shape=point,
					style=invis,
					width=0.05];
*************/
   subgraph clusterXX3{ label="" peripheries=0
				DummyMCContainer	[color=red,
					height=0.21875,
					label=DummyMC,
					pos="769.12,571",
					shape=plain,
					style=dashed,
					width=0.91667];
}
//				"HQ - MANUAL PACKET "	[fontname="Segoe Ui",
				MANUAL	[fontname="Segoe Ui",
					height=1.5694,
					label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'>
<TR><TD ALIGN='Center' colspan='1' PORT="P1"></TD><TD></TD><TD ALIGN='Center' colspan='1' PORT="P2"></TD></TR>
<TR><TD align='Center'><B>HQ - MANUAL PACKET</B></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center'><B>OTHERS</B></TD></TR>

<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Daily</FONT></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Daily</FONT></TD></TR> 

<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD></TR>

<TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT> </TD>
<TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </TD> 
<TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT></TD></TR>
</TABLE>>,
					pos="973.38,415",
					width=2.4965];
				DummyMCContainer -> MANUAL:P1	[color=red,
					minlen=0  //1,
					pos="s,779.47,563.24 e,893.9,471.48 786.7,557.23 813.65,534.84 864,493 864,493 864,493 872.22,487.08 884.14,478.5",
					style=filled];

				DummyMCContainer -> MANUAL:P2  [color=red,
					minlen=0  //1,
					pos="s,801.73,571 e,912.51,571 811.18,571 836.78,571 870.45,571 900.38,571",
					style=filled];
			}
			subgraph clusterCSVContainer {
				graph [bb="720.25,1002,1070.9,1164",
					fontsize=18,
					label="CSV Computers",
					labelloc=t,
					lheight=0.33,
					lp="895.56,1148",
					lwidth=1.83,
					penwidth=1.5,
					style="dashed,rounded"
				];
/********  what is this for?
				CSVContainer	[height=0.05,
					pos="769.12,1108",
					shape=point,
					style=invis,
					width=0.05];
***********/
   subgraph clusterXX4{ label="" peripheries=0
				DummyCSVContainer	[color=red,
group=pro
					height=0.21875,
					label=DummyCSVC,
					pos="769.12,1042",
					shape=plain,
					style=dashed,
					width=1.1354];
}
				"PROTECTION GROUP 1 "	[fontname="Segoe Ui",
group=pro
					height=1.5694,
					label=<<TABLE border='0' cellborder='0' cellspacing='5' cellpadding='0'><TR><TD ALIGN='Center' colspan='1' PORT="P1"></TD></TR><TR><TD align='Center'><B>PROTECTION GROUP 1</B></TD></TR><TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Schedule: Periodically</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Status: Enabled</FONT></TD></TR> <TR><TD align='Center' colspan='1'><FONT POINT-SIZE='14'>Type: Custom</FONT></TD></TR></TABLE>>,
					pos="973.38,1067",
					width=2.4861];
				DummyCSVContainer:s -> "PROTECTION GROUP 1 ":n:P1	[color=red,
					minlen=0  //1,
					pos="s,809.6,1046.9 e,884.02,1056.1 818.9,1048 834.96,1050 853.46,1052.3 871.92,1054.6",
					style=filled];
			}
			MainSubGraph	[height=0.05,
				pos="671.25,981",
				shape=point,
				style=invis,
				width=0.05];
			ProtectedGroup	[fontcolor="#005f4b",
				fontname="Segoe Ui Black",
				fontsize=22,
				height=0.41667,
				label=" ",
				pos="671.25,656",
				shape=plain,
				width=0.083333];
			ProtectedGroup -> DummyADContainer	[color=red,
				minlen=1,
				pos="s,674.13,641.1 e,756.04,252.82 675.3,631.87 685.86,548.26 720.25,276 720.25,276 720.25,276 733.44,267.46 745.97,259.34",
				style=filled];
			ProtectedGroup -> DummyMCContainer	[color=red,
				minlen=1,
				pos="s,673.85,654.2 e,756.04,578.82 680.05,647.23 693.64,631.93 720.25,602 720.25,602 720.25,602 733.44,593.46 745.97,585.34",
				style=filled];
			ProtectedGroup -> DummyICContainer	[color=red,
				minlen=1,
				pos="s,673.91,657.48 e,759.3,733.17 680.57,663.38 696.02,677.08 729.45,706.71 750.24,725.15",
				style=filled];
			ProtectedGroup -> DummyCSVContainer	[color=red,
				minlen=1,
				pos="s,674.19,670.07 e,758.44,1034.3 675.43,679.08 686.15,756.78 720.25,1004 720.25,1004 720.25,1004 735.62,1016.2 748.94,1026.8",
				style=filled];
		}
		MainGraph	[height=0.05,
			pos="119.38,299",
			shape=point,
			style=invis,
			width=0.05];
		"VEEAM-VBR" -> ProtectedGroup	[minlen=3,
			pos="s,504.13,656 e,668.51,656 513.42,656 564.25,656 628.45,656 656.31,656"];
	}
}

Hello,

Sorry for the late reply

The HTML table trick for node objects did the job.

Thanks!

Output.dot (23.2 KB)