You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1114 lines
32 KiB
1114 lines
32 KiB
% Copyright 2006 by Till Tantau
|
|
%
|
|
% This file may be distributed and/or modified
|
|
%
|
|
% 1. under the LaTeX Project Public License and/or
|
|
% 2. under the GNU Public License.
|
|
%
|
|
% See the file doc/generic/pgf/licenses/LICENSE for more details.
|
|
|
|
\ProvidesFileRCS{pgflibraryplothandlers.code.tex}
|
|
|
|
|
|
% This handler converts each plot stream command into a curveto
|
|
% command, except for the first, which is converted to the previously
|
|
% specified action.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfpathmoveto{\pgfpointorigin}
|
|
% \pgfsetlinetofirstplotpoint
|
|
% \pgfplothandlercurveto
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlercurveto}{}{%
|
|
point macro=\pgf@plot@curveto@handler@initial,
|
|
jump macro=\pgf@plot@smooth@next@moveto,
|
|
end macro=\pgf@plot@curveto@handler@finish
|
|
}%
|
|
|
|
\def\pgf@plot@smooth@next@moveto{%
|
|
\pgf@plot@curveto@handler@finish%
|
|
\global\pgf@plot@startedfalse%
|
|
\global\let\pgf@plotstreampoint\pgf@plot@curveto@handler@initial%
|
|
}%
|
|
|
|
\def\pgf@plot@curveto@handler@initial#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@plot@first@action{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@curveto@first{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\global\let\pgf@plot@curveto@first@support=\pgf@plot@curveto@first%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@second%
|
|
}%
|
|
|
|
\def\pgf@plot@curveto@handler@second#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@curveto@second{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@curveto@handler@third%
|
|
\global\pgf@plot@startedtrue%
|
|
}%
|
|
|
|
\def\pgf@plot@curveto@handler@third#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@curveto@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
% compute difference vector:
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\pgf@plot@curveto@first}
|
|
\advance\pgf@xa by-\pgf@x%
|
|
\advance\pgf@ya by-\pgf@y%
|
|
% compute support directions:
|
|
\pgf@xa=\pgf@plottension\pgf@xa%
|
|
\pgf@ya=\pgf@plottension\pgf@ya%
|
|
% first marshal:
|
|
\pgf@process{\pgf@plot@curveto@second}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\advance\pgf@yb by-\pgf@ya%
|
|
\advance\pgf@xc by\pgf@xa%
|
|
\advance\pgf@yc by\pgf@ya%
|
|
\edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@curveto@first@support}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@curveto@second}}%
|
|
{\pgf@marshal}%
|
|
% Prepare next:
|
|
\global\let\pgf@plot@curveto@first=\pgf@plot@curveto@second%
|
|
\global\let\pgf@plot@curveto@second=\pgf@plot@curveto@current%
|
|
\xdef\pgf@plot@curveto@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
}%
|
|
|
|
\def\pgf@plot@curveto@handler@finish{%
|
|
\ifpgf@plot@started%
|
|
\pgfpathcurveto{\pgf@plot@curveto@first@support}{\pgf@plot@curveto@second}{\pgf@plot@curveto@second}%
|
|
\fi%
|
|
}%
|
|
|
|
|
|
% This commands sets the tension for smoothing of plots.
|
|
%
|
|
% #1 = tension of curves. A value of 1 will yield a circle when the
|
|
% control points are at quarters of a circle. A smaller value
|
|
% will result in a tighter curve. Default is 0.5.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetplottension{0.2}
|
|
|
|
\def\pgfsetplottension#1{%
|
|
\pgf@x=#1pt\relax%
|
|
\pgf@x=0.2775\pgf@x\relax%
|
|
\edef\pgf@plottension{\pgf@sys@tonumber\pgf@x}}%
|
|
\pgfsetplottension{0.5}%
|
|
|
|
|
|
% This handler converts the plot stream command into a curveto
|
|
% command that is closed using a closepath.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfpathmoveto{\pgfpointorigin}
|
|
% \pgfplothandlerclosedcurve
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerclosedcurve}{}{%
|
|
point macro=\pgf@plot@closedcurve@handler@initial,
|
|
end macro=\pgf@plot@closedcurve@handler@finish,
|
|
jump macro=\pgf@plot@closedsmooth@next@moveto
|
|
}%
|
|
|
|
\def\pgf@plot@closedsmooth@next@moveto{%
|
|
\pgf@plot@closedcurve@handler@finish%
|
|
\global\pgf@plot@startedfalse%
|
|
\global\let\pgf@plotstreampoint\pgf@plot@closedcurve@handler@initial%
|
|
}%
|
|
|
|
\def\pgf@plot@closedcurve@handler@initial#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\xdef\pgf@plot@closedcurve@initial{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@second%
|
|
\global\pgf@plot@startedfalse%
|
|
}%
|
|
|
|
\def\pgf@plot@closedcurve@handler@second#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@closedcurve@after@initial{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
{\pgfpathmoveto{}}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@third%
|
|
}%
|
|
|
|
\def\pgf@plot@closedcurve@handler@third#1{%
|
|
\global\pgf@plot@startedtrue%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
% compute difference vector:
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\pgf@plot@closedcurve@initial}
|
|
\advance\pgf@xa by-\pgf@x%
|
|
\advance\pgf@ya by-\pgf@y%
|
|
% compute support directions:
|
|
\pgf@xa=\pgf@plottension\pgf@xa%
|
|
\pgf@ya=\pgf@plottension\pgf@ya%
|
|
% first marshal:
|
|
\pgf@process{\pgf@plot@closedcurve@after@initial}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\advance\pgf@yb by-\pgf@ya%
|
|
\advance\pgf@xc by\pgf@xa%
|
|
\advance\pgf@yc by\pgf@ya%
|
|
\global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@after@initial%
|
|
\global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
|
|
\xdef\pgf@plot@closedcurve@after@initial@presupport{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}%
|
|
\xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@closedcurve@handler@fourth%
|
|
}%
|
|
|
|
\def\pgf@plot@closedcurve@handler@fourth#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@closedcurve@current{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
|
|
% compute difference vector:
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\pgf@plot@closedcurve@first}
|
|
\advance\pgf@xa by-\pgf@x%
|
|
\advance\pgf@ya by-\pgf@y%
|
|
% compute support directions:
|
|
\pgf@xa=\pgf@plottension\pgf@xa%
|
|
\pgf@ya=\pgf@plottension\pgf@ya%
|
|
% first marshal:
|
|
\pgf@process{\pgf@plot@closedcurve@second}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\advance\pgf@yb by-\pgf@ya%
|
|
\advance\pgf@xc by\pgf@xa%
|
|
\advance\pgf@yc by\pgf@ya%
|
|
\edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
|
|
{\pgf@marshal}%
|
|
% Prepare next:
|
|
\global\let\pgf@plot@closedcurve@first=\pgf@plot@closedcurve@second%
|
|
\global\let\pgf@plot@closedcurve@second=\pgf@plot@closedcurve@current%
|
|
\xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
}%
|
|
|
|
\def\pgf@plot@closedcurve@handler@finish{%
|
|
\ifpgf@plot@started
|
|
%
|
|
% first, draw line from 2nd last to last:
|
|
%
|
|
\pgf@process{\pgf@plot@closedcurve@initial}%
|
|
% compute difference vector:
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\pgf@plot@closedcurve@first}%
|
|
\advance\pgf@xa by-\pgf@x%
|
|
\advance\pgf@ya by-\pgf@y%
|
|
% compute support directions:
|
|
\pgf@xa=\pgf@plottension\pgf@xa%
|
|
\pgf@ya=\pgf@plottension\pgf@ya%
|
|
% first marshal:
|
|
\pgf@process{\pgf@plot@closedcurve@second}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\advance\pgf@yb by-\pgf@ya%
|
|
\advance\pgf@xc by\pgf@xa%
|
|
\advance\pgf@yc by\pgf@ya%
|
|
\edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@second}}%
|
|
{\pgf@marshal}%
|
|
\xdef\pgf@plot@closedcurve@first@support{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
%
|
|
% second, draw line from last point to start:
|
|
%
|
|
\pgf@process{\pgf@plot@closedcurve@after@initial}%
|
|
% compute difference vector:
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgf@process{\pgf@plot@closedcurve@second}%
|
|
\advance\pgf@xa by-\pgf@x%
|
|
\advance\pgf@ya by-\pgf@y%
|
|
% compute support directions:
|
|
\pgf@xa=\pgf@plottension\pgf@xa%
|
|
\pgf@ya=\pgf@plottension\pgf@ya%
|
|
% first marshal:
|
|
\pgf@process{\pgf@plot@closedcurve@initial}%
|
|
\pgf@xb=\pgf@x%
|
|
\pgf@yb=\pgf@y%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\advance\pgf@xb by-\pgf@xa%
|
|
\advance\pgf@yb by-\pgf@ya%
|
|
\advance\pgf@xc by\pgf@xa%
|
|
\advance\pgf@yc by\pgf@ya%
|
|
\edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgf@plot@closedcurve@first@support}%
|
|
{\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}{\noexpand\pgf@plot@closedcurve@initial}}%
|
|
{\pgf@marshal}%
|
|
%
|
|
% third, draw line from first to second point:
|
|
%
|
|
\edef\pgf@marshal{\noexpand\pgfpathcurveto{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
|
|
{\noexpand\pgf@plot@closedcurve@after@initial@presupport}{\noexpand\pgf@plot@closedcurve@after@initial}}%
|
|
{\pgf@marshal}%
|
|
\pgfpathclose%
|
|
\fi%
|
|
}%
|
|
|
|
|
|
|
|
|
|
|
|
% This handler converts each point in a stream into a line from the
|
|
% $y$-axis to the given points coordinate, resulting in a
|
|
% ``comb.''
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerxcomb
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerxcomb}{}{%
|
|
start macro=\pgfplotxzerolevelstreamstart,
|
|
point macro=\pgf@plot@xcomb@handler,
|
|
end macro=\pgfplotxzerolevelstreamend,
|
|
}%
|
|
|
|
\def\pgf@plot@xcomb@handler#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\begingroup
|
|
\pgfplotxzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
}%
|
|
|
|
|
|
% This handler converts each point in a stream into a line from the
|
|
% $x$-axis straight up to the given points coordinate, resulting in a
|
|
% ``comb.''
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerycomb
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerycomb}{}{%
|
|
start macro=\pgfplotyzerolevelstreamstart,
|
|
point macro=\pgf@plot@ycomb@handler,
|
|
end macro=\pgfplotyzerolevelstreamend
|
|
}%
|
|
|
|
\def\pgf@plot@ycomb@handler#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\begingroup
|
|
\pgfplotyzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
}%
|
|
|
|
% PGF Bar or comb plots usually draw something from zero to the current plot's coordinate.
|
|
%
|
|
% The 'zero' offset can be changed using an input stream.
|
|
%
|
|
% There are two such streams which can be configured independently.
|
|
% The first one returns "zeros" for coordinate x, the second one
|
|
% returns "zeros" for coordinate y.
|
|
%
|
|
% \pgfplotxzerolevelstreamstart
|
|
% \pgfplotxzerolevelstreamnext % assigns \pgf@x globally
|
|
% \pgfplotxzerolevelstreamnext
|
|
% \pgfplotxzerolevelstreamnext
|
|
% \pgfplotxzerolevelstreamend
|
|
%
|
|
% and
|
|
% \pgfplotyzerolevelstreamstart
|
|
% \pgfplotyzerolevelstreamnext % assigns \pgf@x globally
|
|
% \pgfplotyzerolevelstreamend
|
|
%
|
|
\def\pgfplotxzerolevelstreamstart{\pgf@plotxzerolevelstreamstart}%
|
|
\def\pgfplotxzerolevelstreamend{\pgf@plotxzerolevelstreamend}%
|
|
\def\pgfplotxzerolevelstreamnext{\pgf@plotxzerolevelstreamnext}
|
|
\def\pgfplotyzerolevelstreamstart{\pgf@plotyzerolevelstreamstart}%
|
|
\def\pgfplotyzerolevelstreamend{\pgf@plotyzerolevelstreamend}%
|
|
\def\pgfplotyzerolevelstreamnext{\pgf@plotyzerolevelstreamnext}%
|
|
|
|
% This zero level stream always returns '#1' (a dimension).
|
|
\def\pgfplotxzerolevelstreamconstant#1{%
|
|
\edef\pgfplotxzerolevelstreamconstant@val{#1}%
|
|
\def\pgf@plotxzerolevelstreamstart{%
|
|
\global\let\pgf@plotxzerolevelstreamend=\relax
|
|
\gdef\pgf@plotxzerolevelstreamnext{\global\pgf@x=\pgfplotxzerolevelstreamconstant@val\relax}%
|
|
}%
|
|
}%
|
|
\pgfplotxzerolevelstreamconstant{0pt}%
|
|
|
|
% This zero level stream always returns '#1'.
|
|
\def\pgfplotyzerolevelstreamconstant#1{%
|
|
\edef\pgfplotyzerolevelstreamconstant@val{#1}%
|
|
\def\pgf@plotyzerolevelstreamstart{%
|
|
\global\let\pgf@plotyzerolevelstreamend=\relax
|
|
\gdef\pgf@plotyzerolevelstreamnext{\global\pgf@x=\pgfplotyzerolevelstreamconstant@val\relax}%
|
|
}%
|
|
}%
|
|
\pgfplotyzerolevelstreamconstant{0pt}%
|
|
|
|
\def\pgfplotbarwidth{\pgfkeysvalueof{/pgf/bar width}}%
|
|
\def\pgfplotbarshift{\pgfkeysvalueof{/pgf/bar shift}}%
|
|
|
|
\pgfqkeys{/pgf}{%
|
|
bar width/.initial=10pt,
|
|
bar shift/.initial=0pt,
|
|
bar interval width/.initial=1,
|
|
bar interval shift/.initial=0.5,
|
|
%
|
|
% hook which is executed right before a new bar is begun.
|
|
at begin bar/.initial=,
|
|
% hook which is executed right after a bar path has been finished.
|
|
% In this context, the bar's path has not been used.
|
|
at end bar/.initial=,
|
|
}%
|
|
|
|
% This handler places a rectangle at each point in the plot stream, a
|
|
% rectangle which touches the x-axis at one end and the current point
|
|
% at the other end:
|
|
% --(X)--
|
|
% | |
|
|
% | |
|
|
% | |
|
|
% --(0)--
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerybar
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerybar}{}{%
|
|
start={
|
|
\pgfmathparse{\pgfplotbarwidth}%
|
|
\xdef\pgfplotbarwidth@{\pgfmathresult pt}%
|
|
\pgfmathparse{\pgfplotbarshift}%
|
|
\xdef\pgfplotbarshift@{\pgfmathresult pt}%
|
|
\pgfplotyzerolevelstreamstart
|
|
},
|
|
end macro=\pgfplotyzerolevelstreamend,
|
|
point macro=\pgf@plot@ybar@handler
|
|
}%
|
|
|
|
\def\pgf@plot@ybar@handler#1{%
|
|
\pgfkeysvalueof{/pgf/at begin bar}%
|
|
\pgf@process{#1}%
|
|
\pgf@ya=\pgf@y
|
|
\expandafter\pgf@xb\pgfplotbarwidth@\relax
|
|
\pgf@xc=\pgf@x
|
|
\advance\pgf@xc by-.5\pgf@xb
|
|
\advance\pgf@xc by\pgfplotbarshift@\relax
|
|
\begingroup
|
|
\pgfplotyzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\advance\pgf@ya by-\pgf@yb
|
|
\pgfpathrectangle
|
|
{\pgfqpoint{\pgf@xc}{\pgf@yb}}%
|
|
{\pgfqpoint{\pgf@xb}{\pgf@ya}}%
|
|
\pgfkeysvalueof{/pgf/at end bar}%
|
|
}%
|
|
|
|
% This handler places a rectangle at each point in the plot stream, a
|
|
% rectangle which touches the y-axis at one end and the current point
|
|
% at the other end:
|
|
% ---------
|
|
% | |
|
|
% (0) (X)
|
|
% | |
|
|
% ---------
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerxbar
|
|
% \pgfplotxyfile{mytable}
|
|
\pgfdeclareplothandler{\pgfplothandlerxbar}{}{%
|
|
start={
|
|
\pgfmathparse{\pgfplotbarwidth}%
|
|
\xdef\pgfplotbarwidth@{\pgfmathresult pt}%
|
|
\pgfmathparse{\pgfplotbarshift}%
|
|
\xdef\pgfplotbarshift@{\pgfmathresult pt}%
|
|
\pgfplotxzerolevelstreamstart
|
|
},
|
|
end macro=\pgfplotxzerolevelstreamend,
|
|
point macro=\pgf@plot@xbar@handler
|
|
}%
|
|
|
|
\def\pgf@plot@xbar@handler#1{%
|
|
\pgfkeysvalueof{/pgf/at begin bar}%
|
|
\pgf@process{#1}%
|
|
\pgf@ya=\pgf@x
|
|
\expandafter\pgf@xb\pgfplotbarwidth@\relax
|
|
\pgf@xc=\pgf@y
|
|
\advance\pgf@xc by-.5\pgf@xb
|
|
\advance\pgf@xc by\pgfplotbarshift@\relax
|
|
\begingroup
|
|
\pgfplotxzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\advance\pgf@ya by-\pgf@yb
|
|
\pgfpathrectangle
|
|
{\pgfqpoint{\pgf@yb}{\pgf@xc}}%
|
|
{\pgfqpoint{\pgf@ya}{\pgf@xb}}%
|
|
\pgfkeysvalueof{/pgf/at end bar}%
|
|
}%
|
|
|
|
% This handler is a variant of \pgfplothandlerybar which works with
|
|
% intervals instead of points.
|
|
%
|
|
% Bars are drawn between successive input coordinates and the width is
|
|
% determined relatively to the interval length.
|
|
%
|
|
% It looks like this:
|
|
%
|
|
% |---| |-----|
|
|
% | | | |
|
|
% | | | |
|
|
% | | | |
|
|
% (X)------(X)-----------(X)
|
|
%
|
|
% where (X) denotes the x-axis offsets of input coordinates.
|
|
%
|
|
% In more detail, if (x_i,y_i) and (x_{i+1},y_{i+1}) denote successive
|
|
% input coordinates, the bar will be placed above the
|
|
% interval [x_i,x_{i+1}], centered at
|
|
%
|
|
% x_i + \pgfkeysvalueof{/pgf/bar interval shift} * (x_{i+1} - x_i)
|
|
%
|
|
% with width
|
|
%
|
|
% \pgfkeysvalueof{/pgf/bar interval width} * (x_{i+1} - x_i).
|
|
%
|
|
% If you have N+1 input points, you will get N bars (one for each
|
|
% interval). The y_i value of the last bar will be ignored.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerybarinterval
|
|
% \pgfplotxyfile{mytable}
|
|
\pgfdeclareplothandler{\pgfplothandlerybarinterval}{}{%
|
|
start={
|
|
\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
|
|
\xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
|
|
\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
|
|
\xdef\pgfplotbarintervalshift@{\pgfmathresult}%
|
|
\pgfplotyzerolevelstreamstart
|
|
},
|
|
end macro=\pgfplotyzerolevelstreamend,
|
|
point macro=\pgf@plot@ybarinterval@handler@first
|
|
}%
|
|
|
|
\def\pgf@plot@ybarinterval@handler@first#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
|
|
\xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@ybarinterval@handler%
|
|
}%
|
|
\def\pgf@plot@ybarinterval@handler#1{%
|
|
\pgfkeysvalueof{/pgf/at begin bar}%
|
|
\pgf@process{#1}%
|
|
\pgf@ya=\pgf@plot@barinterval@bar
|
|
\xdef\pgf@plot@barinterval@bar{\the\pgf@y}%
|
|
\pgf@xc=\pgf@plot@barinterval@intervalstart\relax
|
|
\xdef\pgf@plot@barinterval@intervalstart{\the\pgf@x}%
|
|
\pgf@xb=\pgf@x
|
|
\advance\pgf@xb by-\pgf@xc
|
|
\advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
|
|
\pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
|
|
\advance\pgf@xc by-.5\pgf@xb% center
|
|
\begingroup
|
|
\pgfplotyzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\advance\pgf@ya by-\pgf@yb
|
|
\pgfpathrectangle
|
|
{\pgfqpoint{\pgf@xc}{\pgf@yb}}%
|
|
{\pgfqpoint{\pgf@xb}{\pgf@ya}}%
|
|
\pgfkeysvalueof{/pgf/at end bar}%
|
|
}%
|
|
|
|
% Like \pgfplothandlerybarinterval but for xbar.
|
|
\pgfdeclareplothandler{\pgfplothandlerxbarinterval}{}{%
|
|
start={
|
|
\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval width}}%
|
|
\xdef\pgfplotbarintervalwidth@{\pgfmathresult}%
|
|
\pgfmathparse{\pgfkeysvalueof{/pgf/bar interval shift}}%
|
|
\xdef\pgfplotbarintervalshift@{\pgfmathresult}%
|
|
\pgfplotxzerolevelstreamstart
|
|
},
|
|
end macro=\pgfplotxzerolevelstreamend,
|
|
point macro=\pgf@plot@xbarinterval@handler@first
|
|
}%
|
|
|
|
\def\pgf@plot@xbarinterval@handler@first#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
|
|
\xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@xbarinterval@handler%
|
|
}%
|
|
\def\pgf@plot@xbarinterval@handler#1{%
|
|
\pgfkeysvalueof{/pgf/at begin bar}%
|
|
\pgf@process{#1}%
|
|
\pgf@ya=\pgf@plot@barinterval@bar
|
|
\xdef\pgf@plot@barinterval@bar{\the\pgf@x}%
|
|
\pgf@xc=\pgf@plot@barinterval@intervalstart\relax
|
|
\xdef\pgf@plot@barinterval@intervalstart{\the\pgf@y}%
|
|
\pgf@xb=\pgf@y
|
|
\advance\pgf@xb by-\pgf@xc
|
|
\advance\pgf@xc by\pgfplotbarintervalshift@\pgf@xb
|
|
\pgf@xb=\pgfplotbarintervalwidth@\pgf@xb
|
|
\advance\pgf@xc by-.5\pgf@xb% center
|
|
\begingroup
|
|
\pgfplotxzerolevelstreamnext
|
|
\endgroup
|
|
\pgf@yb=\pgf@x
|
|
\advance\pgf@ya by-\pgf@yb
|
|
\pgfpathrectangle
|
|
{\pgfqpoint{\pgf@yb}{\pgf@xc}}%
|
|
{\pgfqpoint{\pgf@ya}{\pgf@xb}}%
|
|
\pgfkeysvalueof{/pgf/at end bar}%
|
|
}%
|
|
|
|
|
|
% This handler is very similar to \pgfplothandlerlineto, but it
|
|
% produces CONSTANT connected pieces of the form
|
|
%
|
|
% x
|
|
% |
|
|
% x--- |
|
|
% | x----
|
|
% x-|
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerconstantlineto
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerconstantlineto}{}{%
|
|
point macro=\pgf@plot@const@line@handler
|
|
}%
|
|
|
|
\def\pgf@plot@const@line@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@const@line@handler@@%
|
|
}%
|
|
\def\pgf@plot@const@line@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@yb\pgf@plot@const@line@handler@last\relax
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
|
|
}%
|
|
|
|
% A variant of \pgfplothandlerconstantlineto which places its mark on
|
|
% the right line ends.
|
|
%
|
|
% |---x
|
|
% ---x |
|
|
% |--x
|
|
% x
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerconstantlinetomarkright
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerconstantlinetomarkright}{}{%
|
|
point macro=\pgf@plot@const@line@mark@right@handler
|
|
}%
|
|
|
|
\def\pgf@plot@const@line@mark@right@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@right@handler@@%
|
|
}%
|
|
\def\pgf@plot@const@line@mark@right@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@yb\pgf@plot@const@line@handler@last\relax
|
|
\pgfpathlineto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
|
|
}%
|
|
|
|
% A variant of \pgfplothandlerconstantlineto which places its mark on
|
|
% the middle of the line segment.
|
|
%
|
|
% ----x
|
|
% |
|
|
% --x--- |
|
|
% | |--x----
|
|
% x--
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerconstantlinetomarkmid
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerconstantlinetomarkmid}{}{%
|
|
point macro=\pgf@plot@const@line@mark@mid@handler
|
|
}%
|
|
|
|
\def\pgf@plot@const@line@mark@mid@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@const@line@mark@mid@handler@@%
|
|
}%
|
|
\def\pgf@plot@const@line@mark@mid@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@plot@const@line@handler@last
|
|
\pgf@xc=.5\pgf@xa
|
|
\advance\pgf@xc by.5\pgf@x
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@ya}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
|
|
}%
|
|
|
|
% This handler is in fact a variant of \pgfplothandlerconstantlineto,
|
|
% but it does not draw vertical lines. It produces a sequence of
|
|
% line-to and move-to operations such that plot marks are placed at
|
|
% each right end:
|
|
%
|
|
% ---x
|
|
% ---x
|
|
% ---x
|
|
% --x
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerjumpmarkright
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerjumpmarkright}{}{%
|
|
point macro=\pgf@plot@jumpmarkright@handler
|
|
}%
|
|
|
|
\def\pgf@plot@jumpmarkright@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@x}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkright@handler@@%
|
|
}%
|
|
\def\pgf@plot@jumpmarkright@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@yb\pgf@plot@const@line@handler@last\relax
|
|
\pgfpathmoveto{\pgfqpoint{\pgf@yb}{\pgf@ya}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@xa}%
|
|
}%
|
|
|
|
% This handler is in fact a variant of \pgfplothandlerconstantlineto,
|
|
% but it does not draw vertical lines. It produces a sequence of
|
|
% line-to and move-to operations such that plot marks are placed at
|
|
% each left end:
|
|
%
|
|
% x---
|
|
% x---
|
|
% x---
|
|
% x--
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerjumpmarkleft
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerjumpmarkleft}{}{%
|
|
point macro=\pgf@plot@jumpmarkleft@handler
|
|
}%
|
|
\def\pgf@plot@jumpmarkleft@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@y}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@jumpmarkleft@handler@@%
|
|
}%
|
|
\def\pgf@plot@jumpmarkleft@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@yb\pgf@plot@const@line@handler@last\relax
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}%
|
|
\pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\the\pgf@ya}%
|
|
}%
|
|
|
|
% This handler is in fact a variant of
|
|
% \pgfplothandlerconstantlinetomarkmid,
|
|
% but it does not draw vertical lines. It produces a sequence of
|
|
% line-to and move-to operations such that plot marks are placed like
|
|
%
|
|
% ----x
|
|
%
|
|
% --x--
|
|
% --x----
|
|
% x--
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerjumpmarkmid
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerjumpmarkmid}{}{%
|
|
point macro=\pgf@plot@jump@mark@mid@handler
|
|
}%
|
|
|
|
\def\pgf@plot@jump@mark@mid@handler#1{%
|
|
\pgf@process{#1}%
|
|
\xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
|
|
\pgf@plot@first@action{}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@jump@mark@mid@handler@@%
|
|
}%
|
|
\def\pgf@plot@jump@mark@mid@handler@@#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x
|
|
\pgf@ya=\pgf@y
|
|
\pgf@plot@const@line@handler@last
|
|
\pgf@xc=.5\pgf@xa
|
|
\advance\pgf@xc by.5\pgf@x
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xc}{\pgf@y}}%
|
|
\pgfpathmoveto{\pgfqpoint{\pgf@xc}{\pgf@ya}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
\xdef\pgf@plot@const@line@handler@last{\global\pgf@x=\the\pgf@x\space\global\pgf@y=\the\pgf@y\space}%
|
|
}%
|
|
|
|
|
|
% This handler converts each point in a stream into a line from the
|
|
% origin to the point's coordinate, resulting in a ``star''.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlerpolarcomb
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlerpolarcomb}{}{%
|
|
point macro=\pgf@plot@polarcomb@handler
|
|
}%
|
|
|
|
\def\pgf@plot@polarcomb@handler#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\pgfpathmoveto{\pgfpointorigin}%
|
|
\pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@ya}}%
|
|
}%
|
|
|
|
|
|
|
|
|
|
% This handler draws a given mark at each point.
|
|
%
|
|
% #1 = some code to be executed at each point (with the coordinate
|
|
% system translated to that point).
|
|
% Typically, this code will be \pgfuseplotmark{whatever}.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlermark{\pgfuseplotmark{*}}
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlermark}{#1}{%
|
|
start={
|
|
\def\pgf@plot@mark{%
|
|
\ifnum\pgf@plot@mark@count<\pgf@plot@mark@repeat\relax%
|
|
\else%
|
|
\global\pgf@plot@mark@count=0\relax%
|
|
#1%
|
|
\fi%
|
|
}%
|
|
\global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax%
|
|
\global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax%
|
|
},
|
|
point macro=\pgf@plot@mark@handler
|
|
}%
|
|
|
|
\newcount\pgf@plot@mark@count
|
|
\def\pgf@plot@mark@phase{0}%
|
|
|
|
\def\pgf@plot@mark@handler#1{%
|
|
\global\advance\pgf@plot@mark@count by1\relax%
|
|
{\pgftransformshift{#1}\pgf@plot@mark}%
|
|
}%
|
|
|
|
|
|
% Set the repeat count for marks. For example, if 3 is given as a
|
|
% value, only every third point will get a mark.
|
|
%
|
|
% #1 = repeat count
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetplotmarkrepeat{2}
|
|
|
|
\def\pgfsetplotmarkrepeat#1{\def\pgf@plot@mark@repeat{#1}}%
|
|
\pgfsetplotmarkrepeat{1}%
|
|
|
|
|
|
% Set the phase for marks. For example, if 3 is the repeat and 3 is
|
|
% the phase, already the first point will be marked.
|
|
%
|
|
% #1 = the index of the first point that should be marked.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetplotmarkphase{3}
|
|
|
|
\def\pgfsetplotmarkphase#1{\def\pgf@plot@mark@phase{#1}}%
|
|
\pgfsetplotmarkphase{1}%
|
|
|
|
|
|
|
|
% This handler draws a given mark at those points whose number is
|
|
% given in the (pgffor-like) list.
|
|
%
|
|
% #1 = some code to be executed at each point (with the coordinate
|
|
% system translated to that point).
|
|
% Typically, this code will be \pgfuseplotmark{whatever}.
|
|
% #2 = list of positions like "1,2,4,...,9,10"
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlermarklisted{\pgfuseplotmark{*}}{1,2,4,...,9}
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlermarklisted}{#1#2}{%
|
|
start={
|
|
\let\pgf@plot@mark@list=\pgfutil@empty%
|
|
\edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}}
|
|
\pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}%
|
|
\def\pgf@plot@mark{%
|
|
\edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}%
|
|
\pgf@marshal%
|
|
\ifpgfutil@in@#1\fi%
|
|
}%
|
|
\global\pgf@plot@mark@count=\pgf@plot@mark@repeat\relax%
|
|
\global\advance\pgf@plot@mark@count by-\pgf@plot@mark@phase\relax%
|
|
},
|
|
point macro=\pgf@plot@mark@handler
|
|
}%
|
|
|
|
% \def\pgfplothandlermarklisted#1#2{%
|
|
% \let\pgf@plot@mark@list=\pgfutil@empty%
|
|
% \edef\pgf@marshal{\noexpand\foreach\noexpand\pgf@temp in{#2}}
|
|
% \pgf@marshal{\xdef\pgf@plot@mark@list{\pgf@plot@mark@list(\pgf@temp)}}%
|
|
% \pgf@plothandlermark{%
|
|
% \edef\pgf@marshal{\noexpand\pgfutil@in@{(\the\pgf@plot@mark@count)}{\pgf@plot@mark@list}}%
|
|
% \pgf@marshal%
|
|
% \ifpgfutil@in@#1\fi}%
|
|
% }%
|
|
|
|
|
|
% Define a new plot mark for use with \pgfplotmark.
|
|
%
|
|
% #1 = a plot mark mnemonic
|
|
% #2 = code for drawing the mark
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfdeclareplotmark{*}{\pgfpathcircle{\pgfpointorigin}{2pt}\pgfusepathqfill}
|
|
|
|
\def\pgfdeclareplotmark#1#2{\expandafter\def\csname pgf@plot@mark@#1\endcsname{#2}}%
|
|
|
|
|
|
% Set the size of plot marks. For circles, this will be the radius,
|
|
% for other shapes it should be about half the width/height.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfsetplotmarksize{1pt}
|
|
|
|
\def\pgfsetplotmarksize#1{\pgfmathsetlength\pgfplotmarksize{#1}}%
|
|
|
|
\newdimen\pgfplotmarksize
|
|
\pgfplotmarksize=2pt
|
|
|
|
|
|
% Insert a plot mark's code at the origin.
|
|
%
|
|
% #1 = plot mark mnemonic
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfuseplotmark{*}
|
|
|
|
\def\pgfuseplotmark#1{\csname pgf@plot@mark@#1\endcsname}%
|
|
|
|
|
|
% A stroke-filled circle mark
|
|
|
|
\pgfdeclareplotmark{*}
|
|
{%
|
|
\pgfpathellipse{\pgfpointorigin}{\pgfqpoint{\pgfplotmarksize}{0sp}}{\pgfqpoint{0sp}{\pgfplotmarksize}}%
|
|
\pgfusepathqfillstroke
|
|
}%
|
|
|
|
|
|
% A plus-sign like mark
|
|
|
|
\pgfdeclareplotmark{+}
|
|
{%
|
|
\pgfpathmoveto{\pgfqpoint{-\pgfplotmarksize}{0pt}}%
|
|
\pgfpathlineto{\pgfqpoint{\pgfplotmarksize}{0pt}}%
|
|
\pgfpathmoveto{\pgfqpoint{0pt}{\pgfplotmarksize}}%
|
|
\pgfpathlineto{\pgfqpoint{0pt}{-\pgfplotmarksize}}%
|
|
\pgfusepathqstroke
|
|
}%
|
|
|
|
|
|
% An x-shaped mark
|
|
|
|
\pgfdeclareplotmark{x}
|
|
{%
|
|
\pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
|
|
\pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
|
|
\pgfpathmoveto{\pgfqpoint{-.70710678\pgfplotmarksize}{.70710678\pgfplotmarksize}}%
|
|
\pgfpathlineto{\pgfqpoint{.70710678\pgfplotmarksize}{-.70710678\pgfplotmarksize}}%
|
|
\pgfusepathqstroke
|
|
}%
|
|
|
|
% See pgflibraryplotmarks for more plot marks
|
|
|
|
|
|
|
|
|
|
% This handler turns creates a series of straight line segments
|
|
% between consecutive points, but leaving /pgf/gap around stream point
|
|
% space.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlergaplineto
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfkeys{/pgf/gap around stream point/.initial=1.5pt}%
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlergaplineto}{}{%
|
|
point macro=\pgf@plot@gap@lineto@handler@initial,
|
|
jump macro=\pgf@plot@gap@next@moveto
|
|
}%
|
|
|
|
\def\pgf@plot@gap@next@moveto{%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler@initial%
|
|
}%
|
|
|
|
\def\pgf@plot@gap@lineto@handler@initial#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\xdef\pgf@plot@gap@lineto@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@gap@lineto@handler%
|
|
}%
|
|
|
|
\def\pgf@plot@gap@lineto@handler#1{%
|
|
% Ok, compute normalized line vector
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\xdef\pgf@plot@gap@lineto@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@lineto@last}{\pgf@plot@gap@lineto@next}}}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
|
|
around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@lineto@last}}%
|
|
\pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
|
|
around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@lineto@next}}%
|
|
\global\let\pgf@plot@gap@lineto@last=\pgf@plot@gap@lineto@next%
|
|
}%
|
|
|
|
|
|
|
|
|
|
% This handler works like \pgfplothandlergaplineto, only the last
|
|
% point is connected to the first point, creating a closed curve
|
|
% space.
|
|
%
|
|
% Example:
|
|
%
|
|
% \pgfplothandlergapcycle
|
|
% \pgfplotxyfile{mytable}
|
|
|
|
\pgfdeclareplothandler{\pgfplothandlergapcycle}{}{%
|
|
point macro=\pgf@plot@gap@cycle@handler@initial,
|
|
jump macro=\pgf@plot@gapcycle@next@moveto,
|
|
end macro=\pgf@plot@gap@cycle@handler@finish,
|
|
start={\global\let\pgf@plot@gap@cycle@first\relax}
|
|
}%
|
|
|
|
\def\pgf@plot@gapcycle@next@moveto{%
|
|
\pgf@plot@gap@cycle@handler@finish%
|
|
\global\let\pgf@plot@gap@cycle@first=\relax%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler@initial%
|
|
}%
|
|
|
|
\def\pgf@plot@gap@cycle@handler@initial#1{%
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\xdef\pgf@plot@gap@cycle@last{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\global\let\pgf@plot@gap@cycle@first=\pgf@plot@gap@cycle@last%
|
|
\global\let\pgf@plotstreampoint=\pgf@plot@gap@cycle@handler%
|
|
}%
|
|
|
|
\def\pgf@plot@gap@cycle@handler#1{%
|
|
% Ok, compute normalized line vector
|
|
\pgf@process{#1}%
|
|
\pgf@xa=\pgf@x%
|
|
\pgf@ya=\pgf@y%
|
|
\xdef\pgf@plot@gap@cycle@next{\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
|
|
\pgf@process{\pgfpointnormalised{\pgfpointdiff{\pgf@plot@gap@cycle@last}{\pgf@plot@gap@cycle@next}}}%
|
|
\pgf@xc=\pgf@x%
|
|
\pgf@yc=\pgf@y%
|
|
\pgfpathmoveto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
|
|
around stream point}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}{\pgf@plot@gap@cycle@last}}%
|
|
\pgfpathlineto{\pgfpointadd{\pgfpointscale{\pgfkeysvalueof{/pgf/gap
|
|
around stream point}}{\pgfqpoint{-\pgf@xc}{-\pgf@yc}}}{\pgf@plot@gap@cycle@next}}%
|
|
\global\let\pgf@plot@gap@cycle@last=\pgf@plot@gap@cycle@next%
|
|
}%
|
|
|
|
\def\pgf@plot@gap@cycle@handler@finish{%
|
|
\ifx\pgf@plot@gap@cycle@first\relax%
|
|
\else
|
|
\pgf@plot@gap@cycle@handler{\pgf@plot@gap@cycle@first}%
|
|
\fi
|
|
}%
|
|
|
|
|
|
|
|
\endinput
|
|
|
|
% Local Variables:
|
|
% tab-width: 2
|
|
% End:
|
|
|