Sankey Diagram Tikz 颜色错误

Sankey Diagram Tikz 颜色错误

我刚刚用 Tikz 创建了一个桑基图,我不知道为什么大多数连接的颜色是正确的,但有些是错误的

\documentclass{standalone}
\usepackage{tikz}
\usepackage{verbatim}
\usepackage{sankey}

\begin{document}

\begin{tikzpicture}[]
\begin{sankeydiagram}[]
\sankeyset{
ratio=1cm/15,
outin steps=4,
start style=arrow,
end style=simple,
draw/.style={draw=white,line width=.4pt},
color/.style={fill/.style={fill=#1,fill opacity=.75}},
shade/.style 2 args={fill/.style={
fill=none,line width=0,
top color=#1,bottom color=#2,
middle color=#1!50!#2!50!white,
fill opacity=.75}},
% colors
@define HTML color/.code args={#1/#2}{\definecolor{#1}{HTML}{#2}},
@define HTML color/.list={
healed/09FF00,same/a6cee3,SI/2CCC26,red/fb9a99,orange/fdbf6f,
violet/cab2d6,yellow/ffff99,blue/1f78b4,improved/B2E7AE
},
% colors of countries
@let country color/.code args={#1/#2}{\colorlet{#1}[rgb]{#2}},
@let country color/.list={
SW/red,
MW/orange,
S/same,
I/improved,
SI/SI,
H/healed,
SWLT/red,
MWLT/orange,
SLT/same,
ILT/improved,
SILT/SI,
HLT/healed},
}
\def\vdist{0mm}
\def\hwidth{7.5em}
\def\hdist{5cm}



\sankeynode{name=SW,    quantity=2}
\sankeynode{name=MW,    quantity=4,     at={[yshift=\vdist]SW.left},    anchor=right}
\sankeynode{name=S,     quantity=7,     at={[yshift=\vdist]MW.left},    anchor=right}
\sankeynode{name=I,     quantity=12,    at={[yshift=\vdist]S.left},     anchor=right}
\sankeynode{name=SI,    quantity=36,    at={[yshift=\vdist]I.left},     anchor=right}
\sankeynode{name=H,     quantity=36,    at={[yshift=\vdist]SI.left},    anchor=right}

\foreach \country in {SW,MW,S,I,SI,H}{
\sankeystart[color=\country]{\country}
\sankeyadvance[color=\country]{\country}{\hwidth}
}


\sankeyfork{SW}{1/SW-to-SLT,
                1/SW-to-SWLT}
\sankeyfork{MW}{2/MW-to-ILT,
                1/MW-to-SLT,   
                1/MW-to-SWLT}
\sankeyfork{S}{ 1/S-to-SILT,
                3/S-to-SLT,
                2/S-to-MWLT,
                1/S-to-SWLT}
\sankeyfork{I}{ 1/I-to-HLT,
                3/I-to-SILT,
                1/I-to-SLT,
                4/I-to-ILT,
                1/I-to-MWLT,
                2/I-to-SWLT}
\sankeyfork{SI}{5/SI-to-HLT,
                11/SI-to-SILT,
                6/SI-to-ILT,
                5/SI-to-SLT,
                6/SI-to-MWLT,
                3/SI-to-SWLT}
\sankeyfork{H}{ 14/H-to-HLT,
                11/H-to-SILT,
                3/H-to-ILT,
                3/H-to-SLT,
                1/H-to-MWLT,
                4/H-to-SWLT}

%\sankeyfork{W}{1/W-to-WLT}


\sankeynode{name=SWLT,  quantity=12,    at={[xshift=\hdist]SW.right},    anchor=right}
\sankeynode{name=MWLT,  quantity=10,    at={[yshift=\vdist]SWLT.left},  anchor=right}
\sankeynode{name=SLT,   quantity=14,    at={[yshift=\vdist]MWLT.left},  anchor=right}
\sankeynode{name=ILT,   quantity=15,    at={[yshift=\vdist]SLT.left},   anchor=right}
\sankeynode{name=SILT,  quantity=26,    at={[yshift=\vdist]ILT.left},   anchor=right}
\sankeynode{name=HLT,   quantity=20,    at={[yshift=\vdist]SILT.left},  anchor=right}


\sankeyfork{SWLT}{  4/SWLT-from-H,
                    3/SWLT-from-SI,
                    2/SWLT-from-I,
                    1/SWLT-from-MW,
                    1/SWLT-from-S,
                    1/SWLT-from-SW}
\sankeyfork{MWLT}{  1/MWLT-from-H,
                    6/MWLT-from-SI,
                    1/MWLT-from-I,
                    2/MWLT-from-S}
\sankeyfork{SLT}{   3/SLT-from-H,
                    5/SLT-from-SI,
                    1/SLT-from-I,
                    3/SLT-from-S,
                    1/SLT-from-MW,
                    1/SLT-from-SW}
\sankeyfork{ILT}{   3/ILT-from-H,
                    6/ILT-from-SI,
                    4/ILT-from-I,
                    2/ILT-from-MW}
\sankeyfork{SILT}{  11/SILT-from-H,
                    11/SILT-from-SI,
                    1/SILT-from-S,
                    3/SILT-from-I}
\sankeyfork{HLT}{   14/HLT-from-H,
                    5/HLT-from-SI,
                    1/HLT-from-I}

\foreach \country in {HLT,SILT,ILT,SLT,MWLT,SWLT}{
\sankeyadvance[color=\country]{\country}{\hwidth}
}

\foreach \startcountry/\countries in {
SW/{SLT,SWLT},
MW/{ILT,SLT,SWLT},
S/{SILT,SLT,MWLT,SWLT},
I/{HLT,SILT,ILT,SLT,MWLT,SWLT},
SI/{HLT,SILT,ILT,SLT,MWLT,SWLT},
H/{HLT,SILT,ILT,SLT,MWLT,SWLT}}
{
\foreach \endcountry in \countries {
\sankeyoutin[shade={\startcountry}{\endcountry}]
{\startcountry-to-\endcountry}{\endcountry-from-\startcountry}
}
}



\foreach \country/\countryname in {
SW/Significantly worse,
MW/Mildly worse,
S/Same,
I/Improved,
SI/Significantly improved,
H/Healed,
SWLT/Significantly worse,
MWLT/Mildly worse,
SLT/Same,
ILT/Improved,
SILT/Significantly improved,
HLT/Healed}
{
\node[anchor=east,inner sep=.20em,font=\tiny]
at (\country) {\countryname\vphantom{Ag}};
}

\end{sankeydiagram}
\node (ST1) at (1.25,-0.5) {Short-term $<$1.5 years};
\node (ST2) at (1.25,-0.9) {($\approx$6-18 months)};
\node (LT1) at (9,-0.5) {Long-term $>$5 years};
\node (LT2) at (9,-0.9) {($\approx$15 years)};


\node[label={[label distance=0.5cm,text depth=-1ex,rotate=90]right: \small Operated patients}] at (-1.5,1) {};

\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 100\%}] at (-1.75,6.35) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 75\%}] at (-1.75,4.80) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 50\%}] at (-1.75,3.20) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 25\%}] at (-1.75,1.60) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 0\%}] at (-1.75,-0.05) {};

\end{tikzpicture}

\end{document}

对我来说,这没有任何意义,例如显着改善-->治愈从紫色开始并以绿色结束(相同的解释-->略有恶化从橙色变成绿色而不是从蓝色变成橙色)

...我希望左侧的每个类别都以起始颜色开始

在此处输入图片描述

答案1

要获得水平阴影,请使用left colorright color而不是top colorbottom color...

\documentclass{standalone}
\usepackage{tikz}
\usepackage{verbatim}
\usepackage{sankey}

\begin{document}

\begin{tikzpicture}[]
\begin{sankeydiagram}[]
\sankeyset{
ratio=1cm/15,
outin steps=4,
start style=arrow,
end style=simple,
draw/.style={draw=white,line width=.4pt},
color/.style={fill/.style={fill=#1,fill opacity=.75}},
shade/.style 2 args={fill/.style={
fill=none,line width=0,
left color=#1,right color=#2,
middle color=#1!50!#2!50!white,
fill opacity=.75}},
% colors
@define HTML color/.code args={#1/#2}{\definecolor{#1}{HTML}{#2}},
@define HTML color/.list={
healed/09FF00,same/a6cee3,SI/2CCC26,red/fb9a99,orange/fdbf6f,
violet/cab2d6,yellow/ffff99,blue/1f78b4,improved/B2E7AE
},
% colors of countries
@let country color/.code args={#1/#2}{\colorlet{#1}[rgb]{#2}},
@let country color/.list={
SW/red,
MW/orange,
S/same,
I/improved,
SI/SI,
H/healed,
SWLT/red,
MWLT/orange,
SLT/same,
ILT/improved,
SILT/SI,
HLT/healed},
}
\def\vdist{0mm}
\def\hwidth{7.5em}
\def\hdist{5cm}



\sankeynode{name=SW,    quantity=2}
\sankeynode{name=MW,    quantity=4,     at={[yshift=\vdist]SW.left},    anchor=right}
\sankeynode{name=S,     quantity=7,     at={[yshift=\vdist]MW.left},    anchor=right}
\sankeynode{name=I,     quantity=12,    at={[yshift=\vdist]S.left},     anchor=right}
\sankeynode{name=SI,    quantity=36,    at={[yshift=\vdist]I.left},     anchor=right}
\sankeynode{name=H,     quantity=36,    at={[yshift=\vdist]SI.left},    anchor=right}

\foreach \country in {SW,MW,S,I,SI,H}{
\sankeystart[color=\country]{\country}
\sankeyadvance[color=\country]{\country}{\hwidth}
}


\sankeyfork{SW}{1/SW-to-SLT,
                1/SW-to-SWLT}
\sankeyfork{MW}{2/MW-to-ILT,
                1/MW-to-SLT,   
                1/MW-to-SWLT}
\sankeyfork{S}{ 1/S-to-SILT,
                3/S-to-SLT,
                2/S-to-MWLT,
                1/S-to-SWLT}
\sankeyfork{I}{ 1/I-to-HLT,
                3/I-to-SILT,
                1/I-to-SLT,
                4/I-to-ILT,
                1/I-to-MWLT,
                2/I-to-SWLT}
\sankeyfork{SI}{5/SI-to-HLT,
                11/SI-to-SILT,
                6/SI-to-ILT,
                5/SI-to-SLT,
                6/SI-to-MWLT,
                3/SI-to-SWLT}
\sankeyfork{H}{ 14/H-to-HLT,
                11/H-to-SILT,
                3/H-to-ILT,
                3/H-to-SLT,
                1/H-to-MWLT,
                4/H-to-SWLT}

%\sankeyfork{W}{1/W-to-WLT}


\sankeynode{name=SWLT,  quantity=12,    at={[xshift=\hdist]SW.right},    anchor=right}
\sankeynode{name=MWLT,  quantity=10,    at={[yshift=\vdist]SWLT.left},  anchor=right}
\sankeynode{name=SLT,   quantity=14,    at={[yshift=\vdist]MWLT.left},  anchor=right}
\sankeynode{name=ILT,   quantity=15,    at={[yshift=\vdist]SLT.left},   anchor=right}
\sankeynode{name=SILT,  quantity=26,    at={[yshift=\vdist]ILT.left},   anchor=right}
\sankeynode{name=HLT,   quantity=20,    at={[yshift=\vdist]SILT.left},  anchor=right}


\sankeyfork{SWLT}{  4/SWLT-from-H,
                    3/SWLT-from-SI,
                    2/SWLT-from-I,
                    1/SWLT-from-MW,
                    1/SWLT-from-S,
                    1/SWLT-from-SW}
\sankeyfork{MWLT}{  1/MWLT-from-H,
                    6/MWLT-from-SI,
                    1/MWLT-from-I,
                    2/MWLT-from-S}
\sankeyfork{SLT}{   3/SLT-from-H,
                    5/SLT-from-SI,
                    1/SLT-from-I,
                    3/SLT-from-S,
                    1/SLT-from-MW,
                    1/SLT-from-SW}
\sankeyfork{ILT}{   3/ILT-from-H,
                    6/ILT-from-SI,
                    4/ILT-from-I,
                    2/ILT-from-MW}
\sankeyfork{SILT}{  11/SILT-from-H,
                    11/SILT-from-SI,
                    1/SILT-from-S,
                    3/SILT-from-I}
\sankeyfork{HLT}{   14/HLT-from-H,
                    5/HLT-from-SI,
                    1/HLT-from-I}

\foreach \country in {HLT,SILT,ILT,SLT,MWLT,SWLT}{
\sankeyadvance[color=\country]{\country}{\hwidth}
}

\foreach \startcountry/\countries in {
SW/{SLT,SWLT},
MW/{ILT,SLT,SWLT},
S/{SILT,SLT,MWLT,SWLT},
I/{HLT,SILT,ILT,SLT,MWLT,SWLT},
SI/{HLT,SILT,ILT,SLT,MWLT,SWLT},
H/{HLT,SILT,ILT,SLT,MWLT,SWLT}}
{
\foreach \endcountry in \countries {
\sankeyoutin[shade={\startcountry}{\endcountry}]
{\startcountry-to-\endcountry}{\endcountry-from-\startcountry}
}
}



\foreach \country/\countryname in {
SW/Significantly worse,
MW/Mildly worse,
S/Same,
I/Improved,
SI/Significantly improved,
H/Healed,
SWLT/Significantly worse,
MWLT/Mildly worse,
SLT/Same,
ILT/Improved,
SILT/Significantly improved,
HLT/Healed}
{
\node[anchor=east,inner sep=.20em,font=\tiny]
at (\country) {\countryname\vphantom{Ag}};
}

\end{sankeydiagram}
\node (ST1) at (1.25,-0.5) {Short-term $<$1.5 years};
\node (ST2) at (1.25,-0.9) {($\approx$6-18 months)};
\node (LT1) at (9,-0.5) {Long-term $>$5 years};
\node (LT2) at (9,-0.9) {($\approx$15 years)};


\node[label={[label distance=0.5cm,text depth=-1ex,rotate=90]right: \small Operated patients}] at (-1.5,1) {};

\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 100\%}] at (-1.75,6.35) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 75\%}] at (-1.75,4.80) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 50\%}] at (-1.75,3.20) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 25\%}] at (-1.75,1.60) {};
\node[label={[label distance=0.5cm,text depth=-1ex]right:\tiny 0\%}] at (-1.75,-0.05) {};

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容