答案1
这利用了矩阵不会倾斜的事实。因此,只能倾斜普通节点。(箭头可以用 倾斜\pgflowlevelsynccm
。)
\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{positioning,matrix,fit,backgrounds,arrows.meta}
\newcommand{\grf}[3][]{\phantom{\fbox{#3}}\fbox{#2}\\
\fbox{#3}\phantom{\fbox{#2}}}
\newsavebox\PftA
\newsavebox\PftB
\newsavebox\PftC
\newsavebox\PftD
\newsavebox\PftE
\sbox\PftA{\tikz[scale=0.6,font=\sffamily,transform shape,nodes={fill=white}]{
\node[align=center,draw](A) {Similarity\\ measures};
\node[align=center,right=0.5ex of A,draw]{Aggreation\\ measures};}}
\sbox\PftB{\tikz[scale=0.6,font=\sffamily,transform shape,nodes={fill=white}]{
\node[align=center,draw](A) {Neural\\ Networks};
\node[align=center,below left=0pt of A,draw]{Bayesian\\ Networks};}}
\sbox\PftC{\tikz[scale=0.6,font=\sffamily,transform shape,nodes={fill=white}]{
\node[align=center,draw,minimum height=0.8cm,minimum width=1.5cm](A) {Fuzzy};
\node[align=center,below left=0pt of A,draw,minimum width=1.5cm]{Genetic\\ Algorithms};}}
\sbox\PftD{\tikz[scale=0.6,font=\sffamily,transform shape,nodes={fill=white}]{
\node[align=center,draw](A) {User to user\\ KNN};
\node[align=center,right=0.5ex of A,draw]{Item to item\\ KNN};}}
\begin{document}
\begin{tikzpicture}[%sbox/.style={draw},
standard cell/.style={align=center,xslant=2/3,transform shape,draw,text
width=3cm,anchor=center},
font=\sffamily,node distance=1em and 1em,
connect/.style args={#1 with #2}{insert path={
foreach \Anchor in {north west,north east, south west, south east}
{(#1.\Anchor) -- (#2.\Anchor)}}}]
\matrix[matrix of nodes,
nodes={standard cell},
column sep=-1em,
row 2/.style={nodes={text width=2cm,node font=\small}},
row 3/.style={nodes={densely dotted}},
row 4/.style={nodes={draw=none}},
row 5/.style={nodes={draw=none}},
row 6/.style={nodes={minimum height=1.5cm,fill=white}},
row 7/.style={nodes={minimum height=1.5cm,fill=white}},
row 8/.style={nodes={minimum height=1.5cm,fill=white}},
](mat) {
{non public\\ commercial\\ database} & &{public database\\ ducks\\ koalas} &
\\[-11em]
{content based\\ filtering} & {demographic\\ filtering} &
{collaborative\\ filtering} & \\[-10em]
{\grf{LSI}{SVD} } & &{Memory based\\ \usebox\PftA} & \\[-6em]
{\usebox\PftB} & & & \\[-6em]
{\usebox\PftC} & & & \\[-8em]
|[minimum height=1.5cm]| Model based & & {Hybrid u2u / i2i \\ \usebox\PftD
} & \\[-10em]
& Predictions & & {Cross validation\\ MAE RMSE\\ Coverage} \\[-10em]
& {{\Large Top N}\\ Recommendation} & & {Cross validation\\ Precision
Recall\\ ROC Rank metric} \\
};
\path (-3cm,-12.4cm) rectangle (3cm,1cm);
\begin{scope}[nodes={align=center,xslant=2/3,transform shape},on background
layer]
\node[above=2pt of mat-2-1,xshift=-1em] (HF){Hybrid filtering};
\node[fit=(mat-2-1)(mat-2-3)(HF),draw,inner xsep=1em] (Fit) {};
\draw[densely dotted,connect/.list={mat-2-3 with mat-3-3,
mat-7-2 with mat-8-2,mat-6-1 with mat-7-2,mat-6-3 with mat-7-2,
mat-3-1 with mat-6-1,mat-3-3 with mat-6-3,Fit with mat-3-1}];
\draw[line width=4mm] (mat-8-4.center) -- ++(3.5,0) |-
([yshift=0.4cm]mat-1-3.north) coordinate(aux1);
\draw[line width=4mm,-{Triangle[scale=0.5]},shorten >=1mm,shorten <=-1mm] (aux1|-mat-1-3.north) --
(aux1|-mat-2-3.south);
\draw[line width=4mm,-{Triangle[scale=0.5]},shorten >=1mm,shorten <=-1mm] (mat-1-1.north) coordinate(aux2) --
(aux2|-mat-2-1.south);
\begin{scope}[xslant=2/3]
\pgflowlevelsynccm
\draw[line width=4mm,-{Triangle[scale=0.5]},shorten >=4mm] (mat-8-2) -- (mat-8-4);
\draw[line width=4mm,-{Triangle[scale=0.5]},shorten >=-8mm] (mat-7-2) -- (mat-7-4);
\end{scope}
\end{scope}
\draw[densely dotted] (mat-7-2.south east) -- (mat-8-2.south east)
(mat-7-2.south west) -- (mat-6-1.south west)
(mat-7-2.south east) -- (mat-6-3.south east)
(mat-6-1.south east) -- (mat-3-1.south east);
\end{tikzpicture}
\end{document}