Can you create lines with variable thickness (line width) in Tikz?

Asked
Active
Viewed 6,881 times
40
pluton
- 16,421
Regis Santos
- 14,463
2 Answers
48
This is possible but it's not easy and the control of the line width is not very fine but it's an idea and I think it's possible to get a better code. The code below is from an idea of Mark Wibrow to change the color of a line. I modified the code to change the width but if you only want to change the color this code is perfect :
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{decorations}
\begin{document}
\makeatletter
\pgfkeys{/pgf/decoration/.cd,
start color/.store in =\startcolor,
end color/.store in =\endcolor
}
\pgfdeclaredecoration{width and color change}{initial}{
\state{initial}[width=0pt, next state=line, persistent precomputation={%
\pgfmathdivide{50}{\pgfdecoratedpathlength}%
\let\increment=\pgfmathresult%
\def\x{0}%
}]{}
\state{line}[width=.5pt, persistent postcomputation={%
\pgfmathadd@{\x}{\increment}%
\let\x=\pgfmathresult%
}]{%
\pgfsetlinewidth{\x/40*0.075pt+\pgflinewidth}%
\pgfsetarrows{-}%
\pgfpathmoveto{\pgfpointorigin}%
\pgfpathlineto{\pgfqpoint{.75pt}{0pt}}%
\pgfsetstrokecolor{\endcolor!\x!\startcolor}%
\pgfusepath{stroke}%
}
\state{final}{%
\pgfsetlinewidth{\pgflinewidth}%
\pgfpathmoveto{\pgfpointorigin}%
\color{\endcolor!\x!\startcolor}%
\pgfusepath{stroke}%
}
}
\makeatother
\tikz\draw[ line width=.4pt, decoration={width and color change,
start color=yellow, end color=red}, decorate] (0cm,0cm) arc
(0:120:4cm) ;
\end{document}
To modifiy this code you need to adapt \pgfsetlinewidth{\x/40*0.075pt+\pgflinewidth}

Alain Matthes
- 95,075
-
@Regis da Silva A better solution is to add an option to modify the width (possible only with simple forms and some cases) but like Leo writes, I think the simplest way it's to describe a path and then to fill it – Alain Matthes Mar 26 '11 at 13:34
15
It is possible to increase line width using a foreach statement. Here is an example for a 3D helix:
\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[width=7cm, height=7cm, xmin=-1.05,
xmax=1.05, axis lines=none, view={0}{25}]
\foreach \x in {0,0.5,...,12.0}
{\edef\temp{\noexpand\addplot3[blue, line width=1+\x/2 pt,
domain=\x:\x+0.5,samples y=0]
( { cos( deg(x) ) }, { sin( deg(x) ) }, { x } );
} \temp }
\draw[>=latex,->] (105,100,10) -- (105,100,180);
\node at (95,90,178) { $z$ };
\end{axis}
\end{tikzpicture}
\end{document}

matheburg
- 1,279
-
Welcome to tex.sx! A tip: If you indent lines by 4 spaces, then they are marked as a code sample. You can also highlight the code and click the "code" button (with "101010" on it). – Seamus Apr 06 '11 at 12:56
PSTrickscan. – Leo Liu Mar 26 '11 at 05:50PSTricks, seevariableLWoption in manual pst-news10.pdf. – Leo Liu Mar 26 '11 at 05:52pgfplotsandpoint meta? – gerrit May 30 '12 at 13:36