Как нарисовать диаграмму корреляций пользовательских субъектов

Как нарисовать диаграмму корреляций пользовательских субъектов

Мне нужно создать большую диаграмму, т.е. диаграмму пользовательских предметных корреляций, но я не могу сделать некоторые вещи. Для этого я собираюсь использовать TiкЗ.

Ингредиенты

Ингредиенты:

  1. Название. Тут особо нечего сказать.
  2. Субъекты. Для создания этих объектов я буду использовать исходный кодэтот очень полезный ответ:

    Тема фото

  3. Большие прямоугольники. Каждый прямоугольник будет указывать год (он же уровень), в котором сгруппированы предметы:

    Прямоугольник

  4. Стрелки. Они связывают предметы в рамках одного года учебной программы и даже между разными годами:

    Стрелка

Как вещи собираются

  1. Предметы сгруппированы внутри прямоугольника (год карьеры).
  2. Два предмета могут быть связаны в одном и том же году или в разных годах. Отношения между предметами одного года всегда находятся рядом (один слева, один справа).

Что я наделал

МВЭ:

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=100cm,paperheight=20cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{hyperref}
\usepackage{tikz}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 }

\begin{document}

\thispagestyle{empty}   % To suppress page number

\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\noindent
\begin{Form}    % From https://tex.stackexchange.com/a/478346/152550
    \begin{tikzpicture}
        \path (0,0) pic (Geo)  {nonfillable subject={Subject}} (8.5cm,0) pic (Whatever)  {nonfillable subject={Subject}} (15cm,0) pic[draw=red] (Math)  {nonfillable subject={Math}};
        \draw[-latex] (Geo-Title) -- (Whatever-Title);
        \draw[-latex] (Whatever-Title) -- (Math-Title);
    \end{tikzpicture}
\end{Form}

\noindent
\begin{tikzpicture}
    \fill[fill=orange!30,rounded corners=50pt] (0,0) rectangle (11.5cm,-14cm) node[midway,align=center,font=\LARGE] {\bfseries Level $0$};
\end{tikzpicture}

\end{document}

Что я наделал

Конечный результат

Вот чего я хочу:

Что я хочу

Вам не обязательно копировать текст изображения, но необходимо копировать некоторые предметы и некоторые прямоугольники.

Что мне нужно

  1. Количество прямоугольников варьируется от 6до 7(не как на последнем изображении, где их четыре). Код должен быть максимально простым, чтобы можно было легко добавлять субъектов.
  2. Максимум в каждом прямоугольнике может быть 8не более 9вертикальных объектов, и максимум в каждом прямоугольнике может быть не более 2горизонтальных объектов.
  3. Этикетка текущего года должна располагаться по центру сверху, а не по центру:

    Верхний центр

  4. Насколько прямоугольники и предметы внутри прямоугольников должны быть центрированы по горизонтали и вертикали, не как мои MWE, которые выровнены по левому краю. Короче говоря, все должно быть центрировано:

    Все должно быть центрировано.

  5. Между всеми объектами должно быть соответствующее пространство, и пространство между годом и годом должно быть самым важным, о чем нужно позаботиться, поскольку, если пространства мало, стрелки будут очень близко друг к другу, и документ будет выглядеть некрасиво. В качестве справки вы можете взять измерения (в сантиметрах), которые я рассчитал:

    Измерения, которые я рассчитал

    Если это 7годы (т.е. наибольшее количество), то ширина страницы будет: (0.5+4.5+1.5+4.5+0.5+3)*7-(3)+(1+1), что равно 100.5cm. Я не вычислял высоту, но она должна быть около 20cm(учитывая максимум вертикальных предметов, т.е. 8/9).

    Пока длина листа меньше, это намного лучше., но не ухудшая визуально диаграмму (т.к. я бы также хотел адаптировать диаграмму к формату A4).

Последнее, что может произойти:

Последнее, что могло случиться

(Необязательное требование)

Автоматизируйте цвет стрелок. Каждый субъект имеет свой цвет стрелки. Как вы видите в "Конечный результат", для каждого субъекта есть много стрелок, поэтому идеальным было бы иметь команду, которая, передавая общее количество субъектов, скажем n, делит градиент цветов на nравные части, чтобы сделать цвета однородными. Если это кажется безумием, нет никаких проблем в том, чтобы раскрасить стрелки вручную.

Спасибо!!

решение1

После переписки это улучшенная версия.

  1. Вы можете использовать pics в матрице, а не только узлы. Это очень помогает здесь.
  2. Для горизонтального и вертикального центрирования tikzpictureвы можете просто использовать \centeringи \vfill.
  3. Внешний вид штуки определяется некоторыми ключами и стилями pgf. Это отмечено в коде.
  4. Я добавил всего несколько стрелок, но это показывает в принципе, как идти. Я не знаю надежного способа избежать того, чтобы эти стрелки пересекали узлы.
  5. Вам придется добавлять, \begin{Form}...\end{Form}где это уместно. Я, по сути, понятия не имею, о чем идет речь. Этот пост посвящен TiкZ-часть.

\documentclass{article}
\usepackage[showframe,margin=0in,footskip=0.25in,paperwidth=50cm,paperheight=20cm]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{globalvals}
\usepackage{hyperref}
\usepackage{tikz}
\usetikzlibrary{positioning,backgrounds,fit}
\tikzset{text field/.style={text height=1.5ex,align=center,rounded corners},
title field/.style={text height=2ex,text depth=0.3em,anchor=south,text
width=4.5cm,align=center,font=\footnotesize\sffamily},
pics/fillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace*{-0.5em}\TextField[align=1,name=#1-day,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0.15em}\TextField[align=1,name=#1-month,width=1em,charsize=7pt,maxlen=2,bordercolor={1 1 1}]~~/\hspace*{-0em}\TextField[align=1,name=#1-year,width=2em,charsize=7pt,maxlen=4,bordercolor={1 1 1}]{}~};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }},
pics/nonfillable subject/.style={code={%
\node[text field] (-TF) 
{\hspace{1.2em}~/~\hspace{1.15em}~/~\hspace{2.35em}{}};
\node[title field] (-Title) 
at ([yshift=0.4em]-TF.north) {#1};
\draw[rounded corners] (-TF.south west) |- (-Title.south west)
|- (-Title.north east) -- (-Title.south east) -| (-TF.south east)
 -- cycle;
\draw ([xshift=4pt]-Title.south west) -- ([xshift=-4pt]-Title.south east);
 }}, 
 manoooh/.style={column sep=-2cm,row sep=5mm}
 }

\begin{document}

\thispagestyle{empty}   % To suppress page number

\noindent
\begin{tikzpicture}
\fill[white,fill=orange] (0,0) rectangle (\paperwidth,-2cm) node[midway,align=center,font=\Huge] {\bfseries Some text here\\\LARGE More text here};
\end{tikzpicture}

\vfill
\centering
\begin{tikzpicture}[node distance=3.14cm]
 % step 1: add the matrices, name them mat0, mat1 etc.
 \begin{scope}[local bounding box=matrices] 
  \matrix[manoooh] (mat0)  {
         \pic (A)  {nonfillable subject={Subject}}; & & 
         \pic (B)  {nonfillable subject={Subject}}; \\
         & \pic (C)  {nonfillable subject={Subject}}; & \\
         };
  \matrix[manoooh,right=of mat0] (mat1){
         \pic (D)  {nonfillable subject={Subject}}; \\ 
         \pic (E)  {nonfillable subject={Subject}}; \\
         \pic (F)  {nonfillable subject={Subject}}; \\ 
         \pic (G)  {nonfillable subject={Subject}}; \\ 
         };
  \matrix[manoooh,right=of mat1] (mat2)  {
         \pic (H)  {nonfillable subject={Subject}}; & & 
         \pic (I)  {nonfillable subject={Subject}}; \\
         & \pic (J)  {nonfillable subject={Subject}};  & \\
         \pic (K)  {nonfillable subject={Subject}}; 
         & &
         \pic (L)  {nonfillable subject={Subject}}; \\
         };
  \matrix[manoooh,right=of mat2] (mat3)  {
         & \pic (M)  {nonfillable subject={Subject}};  & \\
         \pic (N)  {nonfillable subject={Subject}}; & & 
         \pic (O)  {nonfillable subject={Subject}}; \\
         \pic (P)  {nonfillable subject={Subject}}; 
         & &
         \pic (Q)  {nonfillable subject={Subject}}; \\
         };
 \end{scope}
 \foreach \X in {0,...,3} %<- if you have more or less matrices, adjust 3       
 {\node[anchor=south,yshift=1cm,align=center,font=\LARGE\bfseries\boldmath] 
 at (mat\X |-matrices.north) (L\X) {Level $\X$};
 \begin{scope}[on background layer]
  % the fit parameters determine the shape of the background rectangles
  \node[fit=(L\X) (mat\X) (matrices.south-|mat\X.south),inner ysep=5mm,
  inner xsep=5mm,fill=orange!30,rounded corners=50pt](F\X){};
 \end{scope}}
 % now add the arrows 
 \foreach \X in {D,...,G}
 {\draw[blue,-latex] (B-Title) to[out=0,in=180] (\X-Title);}
\end{tikzpicture}

\vfill
\end{document}

введите описание изображения здесь

Связанный контент