我正在使用sankey
包来创建桑基图。当使用arrow
Sankey 节点的起始和结束样式时,箭头尖端默认延伸10pt
。
看看包装文档(版本 3.0.1;第 5.4 节,第 21 页),这似乎是一个硬编码值。因此我的问题是:如何最好地使其可配置,以便在绘制图表时可以方便地更改箭头尖端的深度(就像它一样)?
这是一个可供参考的小示例文档(感谢 Alan Munn 的建议):
\documentclass{article}
\usepackage{sankey}
\begin{document}
\begin{tikzpicture}
\begin{sankeydiagram}
\sankeyset{start style=arrow, end style=arrow}
\sankeynodestart{at={0, 0}, name=q0, quantity=5}
\sankeynodestart{at={0, -2}, name=q1, quantity=25}
\sankeyadvance{q0}{2cm}
\sankeyend{q0}
\sankeyadvance{q1}{2cm}
\sankeyend{q1}
\end{sankeydiagram}
\end{tikzpicture}
\end{document}
(全面披露:由于该sankey
软件包是为了回答 tex.sx 上的问题而启动的,我希望这个问题也能导致进一步的开发和该软件包的新版本,其中的值不再是硬编码的。但与此同时,我很感谢您的回答!)
答案1
该arrow
样式只是预定义的样式。您可以定义自己的样式。
定义新样式arrow 20
:
\sankeyset{
new start style={arrow 20}{
(\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
-- ([xshift=-20pt]\name.right) -- (\name.right) -- cycle
}{
(\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
-- ([xshift=-20pt]\name.right) -- (\name.right)
},
new end style={arrow 20}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right) -- cycle
}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right)
},
}
使用方法:
\documentclass{article}
\usepackage{sankey}
\sankeyset{
new start style={arrow 20}{
(\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
-- ([xshift=-20pt]\name.right) -- (\name.right) -- cycle
}{
(\name.left) -- ++(-20pt,0) -- ([xshift=-20pt/6]\name.center)
-- ([xshift=-20pt]\name.right) -- (\name.right)
},
new end style={arrow 20}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right) -- cycle
}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=20pt]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right)
},
}
\begin{document}
\begin{tikzpicture}
\begin{sankeydiagram}
\sankeyset{start style=arrow 20, end style=arrow 20}
\sankeynodestart{at={0, 0}, name=q0, quantity=5}
\sankeynodestart{at={0, -2}, name=q1, quantity=25}
\sankeyadvance{q0}{2cm}
\sankeyend{q0}
\sankeyadvance{q1}{2cm}
\sankeyend{q1}
\end{sankeydiagram}
\end{tikzpicture}
\end{document}
可变长度
您的新样式可以使用宏作为参数。
\documentclass{standalone}
\usepackage{sankey}
\sankeyset{
new start style={variable arrow}{
(\name.left) -- ++(-\arrowvariabledist,0) -- ([xshift=-\arrowvariabledist/6]\name.center)
-- ([xshift=-\arrowvariabledist]\name.right) -- (\name.right) -- cycle
}{
(\name.left) -- ++(-\arrowvariabledist,0) -- ([xshift=-\arrowvariabledist/6]\name.center)
-- ([xshift=-\arrowvariabledist]\name.right) -- (\name.right)
},
new end style={variable arrow}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=\arrowvariabledist]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right) -- cycle
}{
(\name.left) -- ([yshift=1mm]\name.left)
-- ([xshift=\arrowvariabledist]\name.center) -- ([yshift=-1mm]\name.right)
-- (\name.right)
},
}
\begin{document}
\begin{tikzpicture}
\begin{sankeydiagram}
\sankeyset{start style=variable arrow, end style=variable arrow}
\def\arrowvariabledist{30pt}
\sankeynodestart{at={0, 0}, name=q0, quantity=5}
\sankeyadvance{q0}{2cm}
\sankeyend{q0}
\def\arrowvariabledist{20pt}
\sankeynodestart{at={0, -2}, name=q1, quantity=25}
\sankeyadvance{q1}{2cm}
\sankeyend{q1}
\end{sankeydiagram}
\end{tikzpicture}
\end{document}