GraphViz is a nice, extensible tool to draw graphs, trees, diagrams, among others. It's scripted using a simple language called DOT, which reads a lot like text in plain English.
I've published a handful of examples, and an unfinished guide here on this website. You may also find the official user documentation useful.
1graph numbersets { 2» node [ 3» » fontname = "CMU Serif, Latin Modern Roman, serif"; 4» » fontsize = "18"; 5» » width = 0; height = 0; 6» » shape = none; 7» ]; 8» graph [ 9» » fontname = "CMU Serif, Latin Modern Roman, serif"; 10» » fontsize = "20"; 11» » color = "#cccccc"; 12» » packmode = "node"; 13» » style = "rounded"; 14» » margin = 20; 15» ]; 16» margin = 0; 17» 18» subgraph cluster_real { 19» » label = <ℝ <i><font point-size="14">(real)</font></i>>; 20» » subgraph cluster_rational { 21» » » label = <ℚ <i><font point-size="14">(rational)</font></i>>; 22» » » subgraph cluster_integer { 23» » » » label = <ℤ <i><font point-size="14">(integer)</font></i>>; 24» » » » subgraph cluster_natural { 25» » » » » label = <ℕ <i><font point-size="14">(natural)</font></i>>; 26» » » » » 1000 27» » » » » 20; 28» » » » » ; 29» » » » » 0; 30» » » » }; 31» » » » -1; 32» » » » -20; 33» » » » -1000; 34» » » }; 35» » » "1/2" [ 36» » » » label = < 37» » » » » <table border="0" cellspacing="0" cellpadding="0"> 38» » » » » » <tr> 39» » » » » » » <td border="1" sides="b">1</td> 40» » » » » » </tr> 41» » » » » » <tr> 42» » » » » » » <td border="0">2</td> 43» » » » » » </tr> 44» » » » » </table> 45» » » » >; 46» » » ]; 47» » » "4/3" [ 48» » » » label = < 49» » » » » <table border="0" cellspacing="0" cellpadding="0"> 50» » » » » » <tr> 51» » » » » » » <td border="1" sides="b">3</td> 52» » » » » » </tr> 53» » » » » » <tr> 54» » » » » » » <td border="0">4</td> 55» » » » » » </tr> 56» » » » » </table> 57» » » » >; 58» » » ]; 59» » » "3 1/7" [ 60» » » » label = < 61» » » » » <table border="0" cellspacing="0" cellpadding="0"> 62» » » » » » <tr> 63» » » » » » » <td rowspan="2" cellpadding="4">3</td> 64» » » » » » » <td border="1" sides="b">1</td> 65» » » » » » </tr> 66» » » » » » <tr> 67» » » » » » » <td border="0">7</td> 68» » » » » » </tr> 69» » » » » </table> 70» » » » >; 71» » » ]; 72» » }; 73» » subgraph cluster_irrational { 74» » » label = <ℝ\\ℚ <i><font point-size="14">(irrational)</font></i>>; 75» » » root30 [label = "√30"]; 76» » » root2 [label = "√2"]; 77» » » e [label = <<i>e</i>>]; 78» » » pi [ 79» » » » fontname = "CMU Serif, Latin Modern Math, serif"; 80» » » » label = <<i>π</i>> 81» » » ]; 82» » }; 83» }; 84}