如何绘制自定义主题相关性图表

如何绘制自定义主题相关性图表

我需要创建一个大型图表,即自定义主题相关性图表,但我无法执行某些操作。为此,我将使用 TiZ。

原料

成分如下:

  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垂直主题,每个矩形最多有21 个水平主题。
  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. 您可以pic在矩阵中使用 s,而不仅仅是节点。这在这里很有帮助。
  2. 对于的水平和垂直居中,tikzpicture您只需使用\centering\vfill
  3. 该物体的外观由一些 pgf 键和样式决定。这在代码中已标记。
  4. 我只添加了很少的箭头,但这在原则上说明了该怎么做。我不知道有什么万无一失的方法可以避免这些箭头穿过节点。
  5. 您必须\begin{Form}...\end{Form}在适当的地方添加。我基本上不知道这涉及什么。这篇文章重点介绍 TiZ 部分。

\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}

在此处输入图片描述

相关内容