Выравнивание графика

Sep 20 2020

Я новичок в tikz и делаю некоторые упражнения. Я познакомился с примером небольшой байесовской сети в книге « Вероятностные графические модели » и подумал, что попробую нарисовать. Это 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}