How can I draw this diagram in LaTeX?

enter image description here


1 Answer 1


Here's a effort in Metapost using the boxes library. Feel free to adapt.

enter image description here

input boxes
    boxit.madm("\stack{Multiple attribute\\decision making}");

    boxit.nongen("1. No information");
    boxit.attgen("2. Information on attribute");
    boxit.altgen("3. Information on alternative");

    boxit.att.std("2.1 Standard level");
    boxit.att.ord("2.2 Ordinal");
    boxit.att.car("2.3 Cardinal");
    boxit.att.mar("\stack{2.4 Marginal rate\\of substitution}");

    boxit.alt.pref("3.1 Pairwise preference");
    boxit.alt.prox("3.2 Order of pairwise proximity");

    boxit.non.dom("1.1.1 Dominance");
    boxit.non.maxi("1.1.2 Maximin");
    boxit.non.mini("1.1.3 Minimax");

    boxit.att.std.con("2.1.1 Conjunctive (Satisficing) method");
    boxit.att.std.dis("2.1.2 Disjunctive method");
    boxit.att.ord.lex("2.2.1 Lexicographic method");
    boxit.att.ord.asp("2.2.2 Elimination by aspects");
    boxit.att.ord.per("2.2.3 Permutation method");

    boxit.att.car.lam("2.3.1 Linear assignment method");
    boxit.att.car.saw("2.3.2 Simple additive weighting (SAW) method");
    boxit.att.car.haw("2.3.3 Hierarchical additive weighting");
    boxit.att.car.elc("2.3.4 ELECTRE");
    boxit.att.car.tps("2.3.5 TOPSIS");
    boxit.att.mar.hit("2.4.1 Hierarchical tradeoffs");

    boxit.alt.pref.lin("3.1.1 LINMAP");
    boxit.alt.pref.ism("3.1.2 Interactive SAW method");
    boxit.alt.prox.mds("3.2.1 MDS with ideal point");

    % place all the detailed boxes
    y = 0;
    forsuffixes @=non.dom, non.maxi, non.mini, 
        att.std.con, att.std.dis, 
        att.ord.lex, att.ord.asp, att.ord.per, 
        att.car.lam, att.car.saw, att.car.haw, att.car.elc, att.car.tps, 
        alt.pref.lin, alt.pref.ism, alt.prox.mds:
        @.w = (377, -20 incr y);

    % now work out the middle column positions, relative to the detail
    att.std.w  = (200, ypart 1/2[att.std.con.w, att.std.dis.w]);
    att.ord.w  = (200, ypart 1/2[att.ord.lex.w, att.ord.per.w]);
    att.car.w  = (200, ypart 1/2[att.car.lam.w, att.car.tps.w]);
    att.mar.w  = (200, ypart att.mar.hit.w);
    alt.pref.w = (200, ypart 1/2[alt.pref.lin.w, alt.pref.ism.w]); 
    alt.prox.w = (200, ypart alt.prox.mds.w); 

    % and the top level relative to the middle
    nongen.w = (34, ypart non.maxi.c);
    attgen.w = (34, ypart 1/2[att.std.w, att.mar.w]);
    altgen.w = (34, ypart 1/2[alt.pref.w, alt.prox.w]);

    % and the root
    madm.e = attgen.w shifted 42 left;

    % draw all the "boxes" but without the lines round them...
    drawunboxed(madm, nongen, attgen, altgen, att.std, att.ord, att.car, att.mar, alt.pref, alt.prox);

    % now do three sets of lines in different colours
    drawoptions(withcolor 2/3 red);

    draw madm.c { right } .. tension 1.2 .. { right } nongen.w cutbefore bpath madm;

    forsuffixes @ = non.dom, non.maxi, non.mini:
        draw nongen.e -- (340, ypart nongen.e) {right} .. {right} @.w;

    drawoptions(withcolor 2/3 blue);

    draw madm.c { right } .. tension 1.2 .. { right } attgen.w cutbefore bpath madm;

    forsuffixes @ = att.std, att.ord, att.car, att.mar:
        draw attgen.c { right } .. tension 1.2 .. { right } @.w cutbefore bpath attgen;

    forsuffixes @ = att.std.con, att.std.dis:
        draw att.std.e -- (340, ypart att.std.e) {right} .. {right} @.w;

    forsuffixes @ = att.ord.lex, att.ord.asp, att.ord.per:
        draw att.ord.e -- (340, ypart att.ord.e) {right} .. {right} @.w;

    forsuffixes @ = att.car.lam, att.car.saw, att.car.haw, att.car.elc, att.car.tps:
        draw att.car.e -- (340, ypart att.car.e) {right} .. {right} @.w;

    draw att.mar.e -- att.mar.hit.w;

    drawoptions(withcolor 2/3 green);
    draw madm.c { right } .. tension 1.2 .. { right } altgen.w cutbefore bpath madm;

    forsuffixes @ = alt.pref, alt.prox:
        draw altgen.c { right } .. tension 1.2 .. { right } @.w cutbefore bpath altgen;

    forsuffixes @ = alt.pref.lin, alt.pref.ism:
        draw alt.pref.e -- (340, ypart alt.pref.e) {right} .. {right} @.w;

    draw alt.prox.e -- alt.prox.mds.w;



This is done with luamblib so you need to compile it with lualatex (Or work out how to adapt it for GMP + pdflatex, or plain Metapost).

  • I couldnt make a diagram so I posted the image on my memoir but with your help I can make the diagram, and the way you did it is very nice, so thank you very much :)
    – Red One
    Commented Apr 28, 2018 at 14:02
  • I'm new in Latex, can you please tell me how can I adapt this for pdflatex ? I'm working on the website ShareLaTeX by the way.
    – Red One
    Commented Apr 28, 2018 at 14:44
  • (a) if you follow the GMP link I posted, you will find the documentation for GMP in gmp.pdf, which explains how to use Metapost with pdflatex. (b) But ShareLatex has a pretty complete implementation of LuaLatex, so you should find that my example compiles as is; just set the Compiler option to LuaLaTex in the menu at the top left.
    – Thruston
    Commented Apr 28, 2018 at 15:26
  • I have read the gmp.pdf file but I didnt understand how to use your code in PdfLaTeX, and I already tried to change the compiler option in LuLaTeX in ShareLatex but it didn't work, I guess it's because I have used other packages in my memoir files that work only with PdfLaTex, I will ask a new question on how to adapt the code you wrote on pdfLaTex.
    – Red One
    Commented Apr 28, 2018 at 18:27
  • You might also choose to create a PDF file of the diagram using lualatex on the standalone class shown in my example, and then include that in your main file using \includegraphics....
    – Thruston
    Commented Apr 28, 2018 at 19:27

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .