我正在准备一个关于 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
库计算右上角节点的高度。