如何在 tikz 中绘制块堆栈?

如何在 tikz 中绘制块堆栈?

我正在准备一个关于 Python 科学计算的演示文稿,并尝试绘制一个框图来展示此环境中使用的软件堆栈。我想出了一个很好的输出,但由于我不是 tikz 专家,所以我咨询你来指导我最好的方法。

我的方法的一个缺点是,一个块中的任何更改(更多文本)都会扩大该块,并且必须更改其他块的测量值。我的问题是,有没有什么方法可以更轻松地制作这种图形。

如果没有其他办法,您能否看一下我的代码,并指导我找到绘制此类图形时遗漏的和应该使用的东西。

谢谢并问候 Abdullah

 \documentclass{article}
\usepackage{tikz}

\usetikzlibrary{arrows,shapes}
\usetikzlibrary{arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri}

\begin{document}



\tikzstyle{basics}=[rectangle, fill=red!20, node distance = 0, 
                  minimum height=1cm, minimum width=6.05cm,
                 ]
\tikzstyle{numpy}=[rectangle, fill=red!20, node distance = 0, 
                  minimum height=1cm, minimum width=4cm,
                 ]                 
\tikzstyle{upper}=[rectangle,
                   fill = green!10, node distance = 0,
                   minimum height=0.7cm,
                   minimum width=2cm,
                   ]

\tikzstyle{background}=[rectangle,
                                                fill=gray!15,
                                                inner sep=0.5cm,
                                                rounded corners=5mm]

\tikzstyle{sympi}=[rectangle,
                   fill= green!30, node distance=0,
                   minimum height= 1.7cm, minimum width = 1cm,
                    ]                                               
\centering                                                
\begin{figure}

\begin{tikzpicture}
\node (python) [basics] {Python Core} ;
\node (numpy) [ numpy, fill = blue!20, above=of python.north west, anchor=south west] {Numpy} ;
\node (scipy) [upper, align=center, above=of numpy.north west, anchor=south west] {Scipy lib};
\node (Pandas) [upper, right=of scipy] {Pandas};
\node (Sympi) [sympi,right=of Pandas.north east,  anchor=north west]
 {\rotatebox{90}{Sympi}};
\node (Matplotlib) [sympi,right=of Sympi]
  {\rotatebox{90}{{\footnotesize Matplotlib}}};
\node (ipython) [node distance = 0.2, below=of python  ] {IPython Interactive Computing};

\begin{pgfonlayer}{background}
        \node [background,
                    fit=(python) (numpy) (scipy) (Pandas) (Sympi) (ipython),
                   label=above:Python Scientific Enviroment ] {};

    \end{pgfonlayer}

\end{tikzpicture}
\end{figure}

\end{document}    

在此处输入图片描述

答案1

尝试:

\documentclass[border=3mm,tikz,preview]{standalone}

\usetikzlibrary{calc,backgrounds,positioning,fit}

    \begin{document}
    \begin{tikzpicture}[
    node distance = 0mm,
block/.style args = {#1,#2}{fill=#1,
                            text width=#2,
    shape=rectangle, draw=gray!30, thick,
    minimum height=11mm, align=center, 
    inner sep=0mm, outer sep=0mm}
                        ]    
\node[block={red!20,60mm},
      label=below:IPython Interactive Computing]              
                                        (python)    {Python Core};
\node[block={blue!20,38mm}, 
      above right=of python.north west] (numpy)     {Numpy} ;
\node[block={green!20,19mm},
      above right=of numpy.north west]  (scipy)     {Scipy lib};
\node[block={green!20,19mm},
      right=of scipy]        (pandas)    {Pandas};
\path   let \p1 = (numpy.south west),
            \p2 = (scipy.north west),
            \n1 = {veclen(\x2-\x1,\y2-\y1)} in 
    node[block={green!30,11mm},minimum height=\n1,
         above right=of numpy.south east]  
                            (simpy)     {\rotatebox{90}{Sympi}}
    node[block={green!30,11mm},minimum height=\n1,
         right=of simpy]    (matlib)    {\rotatebox{90}{Matplotlib}};
\scoped[on background layer]
\node[rounded corners=5mm,fill=gray!30,
      inner sep=4mm,yshift=-2mm,
      label=above:Python Scientific Enviroment,
      fit=(python) (scipy)]             {};
\end{tikzpicture}
    \end{document}

这使: 在此处输入图片描述

颜色可能不符合您的要求,但这只是一个小问题,可以轻松调整以满足您的要求。

如您所见,您的 MWE 和我的 MWE 之间的主要区别在于预设。我没有为每个节点预设一个形状,而是只使用一个(“通用”)和两个可选参数,每次使用时我都会更改它们。可选参数是节点的填充颜色和文本宽度。

另一个“技巧”是使用calc库计算右上角节点的高度。

相关内容