การจัดแนวกราฟ

Sep 20 2020

ฉันยังใหม่กับ tikz และได้ออกกำลังกายมาบ้าง ฉันยกตัวอย่างของเครือข่ายเบย์เซียนเล็ก ๆ ในหนังสือ " Probabilistic Graphical Models " และคิดว่าจะลองวาดดู graphsดูเหมือนเลือกที่ดีที่สุดที่โหนดจะถูกกำหนดโดยการเชื่อมต่อพวกเขา แต่โมดูลวางโหนดทั้งหมดในวิธีที่ค่อนข้างแปลก นี่คือภาพ

และนี่คือรหัส:

\documentclass{standalone}
\usepackage[utf8]{inputenc}
%\usepackage[margin=1cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, graphs, matrix, shapes.geometric}

\begin{document}
\begin{tikzpicture}
        \graph[grow down, grow down sep=3mm, branch right=2.5cm,
        edges={>=Latex, semithick, color=black},
        nodes={draw, ellipse, fill=black!10, very thick,
        minimum width=2cm, minimum height=10mm}] {
        GC -> {
            BC -!- GH -> {
                BH,
                GB -> BB,
                GL -> BL,
                GN -> BN,
            },
            GM -> {
                GB,
                GL,
                GN,
                BM,
            },
            GS -> BS,
        },
        GJ -> {
            GM,
            GS,
            BJ,
        },
    };
    \end{tikzpicture}
\end{document}

ฉันคิดว่าฉันเข้าใจสิ่งที่เกิดขึ้น โหนดGJถูกผลักไปทางขวาเพื่อสร้างพื้นที่สำหรับส่วนที่เหลือของต้นไม้ ฉันสงสัยว่ามีวิธีที่จะทำให้กราฟมีขนาดกะทัดรัดมากขึ้นหรือไม่โดยแต่ละระดับจะจัดแนวในแนวนอน นอกจากนี้ฉันยังสงสัยว่าฉันจะเปลี่ยนกลุ่มโหนด (แนวนอนแนวตั้ง) เพื่อแสดงตรรกะในกราฟได้อย่างไร G (X) ควรอยู่ในระดับเดียวกันและ B (X) ควรอยู่ต่ำกว่า

เค้าโครงกราฟที่เหมาะสมอยู่ด้านล่างและฉันใช้การรวมกันของmatrixและgraphsซึ่งฉันไม่พอใจเลยเพราะมันเอาชนะประโยชน์ของgraphsโมดูลเอง

ขอบคุณ.

คำตอบ

1 Evion Sep 20 2020 at 21:27

ผ่านLayered layoutตัวเลือกคุณจะไม่นำรูปทรงกลมสำหรับโหนดมาใช้หรือไม่จดบันทึกแพ็คเกจและรวบรวมด้วย Lualatex ตามที่แนะนำใน pgfmanual / tikz :)

\documentclass{standalone}
\usepackage[utf8]{inputenc}
%\usepackage[margin=1cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, graphs,graphdrawing, shapes.geometric }
\usegdlibrary{layered}
\begin{document}

%Compile with luaLatex
\begin{tikzpicture}
   
        \graph[
          layered layout, 
          sibling distance =3cm, 
          level distance =3cm, 
          edges={>=Latex, semithick, color=black},
          nodes={draw, ellipse, fill=black!10, very thick,
         minimum width=2cm, minimum height=10mm}
         ]
        {
        GC -> {
            BC -!- GH -> {
                BH,
                GB -> BB,
                GL -> BL,
                GN -> BN,
            },
            GM -> {
                GB,
                GL,
                GN,
                BM,
            },
            GS -> BS,
        },
        GJ -> {
            GM,
            GS,
            BJ,
        },
    };
    \end{tikzpicture}
\end{document}