Create GraphViz DOT graph with dotnet (compatible with .NET Standard 2.0 and higher).
var graph = new DotGraph().WithIdentifier("MyGraph"); var directedGraph = new DotGraph().WithIdentifier("MyDirectedGraph").Directed();var myNode = new DotNode() .WithIdentifier("MyNode") .WithShape(DotNodeShape.Ellipse) .WithLabel("My node!") .WithFillColor(DotColor.Coral) .WithFontColor(DotColor.Black) .WithStyle(DotNodeStyle.Dotted) .WithWidth(0.5) .WithHeight(0.5) .WithPenWidth(1.5); // Add the node to the graph graph.Add(myNode);// Create an edge with identifiers var myEdge = new DotEdge().From("Node1").To("Node2"); // Or with nodes and attributes var myEdge = new DotEdge() .From(node1) .To(node2) .WithArrowHead(DotEdgeArrowType.Box) .WithArrowTail(DotEdgeArrowType.Diamond) .WithColor(DotColor.Red) .WithFontColor(DotColor.Black) .WithLabel("My edge!") .WithStyle(DotEdgeStyle.Dashed) .WithPenWidth(1.5); // Add the edge to the graph graph.Add(myEdge);// Subgraph identifier need to start with "cluster" to be identified as a cluster var mySubgraph = new DotSubgraph().WithIdentifier("cluster_0"); // Create a subgraph with attributes (only used for cluster) var mySubgraph2 = new DotSubgraph() .WithIdentifier("cluster_1") .WithColor(DotColor.Red) .WithStyle(DotSubGraphStyle.Dashed) .WithLabel("My subgraph!"); // Add node, edge, subgraph subGraph.Add(myNode); subGraph.Add(myEdge); subGraph.Add(mySubgraph2); // Add subgraph to main graph graph.Add(mySubgraph);await using var writer = new StringWriter(); var context = new CompilationContext(writer, new CompilationOptions()); await graph.CompileAsync(context); var result = writer.GetStringBuilder().ToString(); // Save it to a file File.WriteAllText("graph.dot", result);