public Bitmap RenderTree(DecisionTree tree, Size blockSize) { var descendents = tree.Root.Descendents; var numberOfLeaves = descendents.Count(item => item.IsLeaf); var depth = tree.Root.Descendents.Max(item => item.Depth); var offset = new Size(50, 50); if (numberOfLeaves > 20) { tree.Options.MaxNumberOfTerminalNodes = 20; tree.Prune(); descendents = tree.Root.Descendents; numberOfLeaves = descendents.Count(item => item.IsLeaf); depth = tree.Root.Descendents.Max(item => item.Depth); } var width = ((2 * blockSize.Width) * numberOfLeaves) + 2 * (offset.Width); var height = ((blockSize.Height + 100) * (depth + 1)) + 2 * (offset.Height); blockSize.Height = blockSize.Height + 100; NodeRenderer nr = new NodeRenderer(blockSize, offset); Bitmap bitmap = new Bitmap(width, height); Graphics graphics = Graphics.FromImage(bitmap); graphics.FillRectangle(Brushes.White, 0, 0, width, height); var coordinates = GetCoordinates(tree.Root); foreach (var coordinate in coordinates) { var node = coordinate.Key; nr.RenderNode(graphics, coordinate.Value, node); if (!node.IsLeaf) { foreach (var child in node.Children) { nr.RenderEdges(graphics, coordinate.Value, coordinates[child], string.Format("{0} {1}", DecisionTree.GetStringCondition(child.Condition), child.ThreshHold)); } } } return(bitmap); }