% Copyright 2019 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{tikzlibrarydatavisualization.code.tex} \usepgfmodule{datavisualization}% \usetikzlibrary{backgrounds}% \tikzset{/tikz/data visualization/.is family, /tikz/data visualization/.unknown/.code={ \let\tikz@dv@key\pgfkeyscurrentname% \pgfkeys{/tikz/\tikz@dv@key/.try={#1}}% \ifpgfkeyssuccess% \else% \edef\pgf@temp{/errors/unknown key={/tikz/data visualization/\tikz@dv@key}}% \expandafter\pgfkeys\expandafter{\pgf@temp{#1}}% \fi% }, /tikz/data visualization/data/.unknown/.code={% % Redirect to /pgf/data \let\tikz@dv@key\pgfkeyscurrentname% \pgfkeys{/pgf/data/\tikz@dv@key/.try={#1}}% \ifpgfkeyssuccess% \else% \edef\pgf@temp{/errors/unknown key={/pgf/data/\tikz@dv@key}}% \expandafter\pgfkeys\expandafter{\pgf@temp{#1}}% \fi% }, }% \def\tikzdatavisualizationset{\pgfqkeys{/tikz/data visualization}}% % The main \datavisualization command % % This command must, as always, be given inside a tikz picture. It % will add a data visualization to the picture; use "shift" option and % friends to place the data visualization somewhere other than at the % origin. % % The \datavisualization is followed by a sequence of blocks and ended % with a semicolon. Each block may be one of the following: % % "data" blocks. % % Syntax: data [options] % options specify an external source % Syntax: data [options] { inline data } % % The optional arguments may either specify an % external data source or the data may follow inline. % % The options are executed for the path /pgf/data. The style % /tikz/every data is executed for each data, which can be useful to % generally set, say, a certain data format. % % % "data set" blocks. % % Syntax: data set [options] {name} = { ... } % Syntax: data set [options] {name} += { ... } % Syntax: data set [options] {name} % % The first syntax allows you to define a data set. The data block % inside {...} will be stored inside the data set % "name". Subsequently, the data set can be referenced by using the % third syntax. The second syntax allows you to extend the % definition of an already defined data set. % % % "info" and "info'" blocks. % % Syntax: info [options] {code} % Syntax: info' [options] {code} % % A block starting with "info" or "info'" may contain any code. It % will be executed after the visualization (info) or before the % visualization (info'). % % % Options blocks. % % Syntax: [options] % % The options will be executed immediately. % % Scope blocks. % % Syntax: scope[options] { blocks } % % The blocks are executed inside a scope for which the options are % set. This can be used to group data blocks. % % Examples: % % \datavisualization[schoolbook plot] % data [source=my_data_file.csv] % ; % % \datavisualization[schoolbook plot] % data [format=key value pairs] % { % x=0, y=0 % x=1, y=1 % x=2, y=4 % x=3, y=9 % }; % % \datavisualization[schoolbook plot] % data [format=function] % { % var x: interval [0:3]; % func y = \value x*\value x; % } % [at begin visualization={ % \fill [black!10] (visualization cs:x=0,y=0) -- (visualization cs:x=3,y=9); % }] % info[red] % { % \draw (visualization cs:x=0,y=0) -- (visualization cs:x=3,y=9); % }; % % \datavisualization[schoolbook plot] % data [/data point/label=first experiment,source=file_1] % data [/data point/label=second experiment,source=file_2] % data [/data point/label=third experiment,source=file_3] % data [/data point/label=prediction,format=function] % { var x: interval [0,1]; func y = rand(\value x); } % ; \def\tikz@lib@datavisualization{ \begingroup% \let\tikz@path@do@at@end=\relax% % Ok, first, start a new data visualization \pgfoonew \tikz@main@dv=new data visualization()% % Next, create a scope for the dv \pgfset{local bounding box=data visualization bounding box}% % Clear the axis list \pgfkeyslet{/tikz/data visualization/axes list}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/axes actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/label actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/legend actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/grid actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/major grid actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/minor grid actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/subminor grid actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/ticks actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/major ticks actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/minor ticks actions}\pgfutil@empty% \pgfkeyslet{/tikz/data visualization/subminor ticks actions}\pgfutil@empty% \tikz@main@dv.before visualization(% )% \tikz@main@dv.after visualization(% \tikz@lib@dv@alias@dv@bb \pgfkeysvalueof{/tikz/data visualization/grid actions} \pgfkeysvalueof{/tikz/data visualization/subminor grid actions} \pgfkeysvalueof{/tikz/data visualization/minor grid actions} \pgfkeysvalueof{/tikz/data visualization/major grid actions} \pgfkeysvalueof{/tikz/data visualization/ticks actions} \pgfkeysvalueof{/tikz/data visualization/subminor ticks actions} \pgfkeysvalueof{/tikz/data visualization/minor ticks actions} \pgfkeysvalueof{/tikz/data visualization/major ticks actions} \pgfkeysvalueof{/tikz/data visualization/axes actions} \pgfkeysvalueof{/tikz/data visualization/label actions} \pgfkeysvalueof{/tikz/data visualization/legend actions} )% % \pgfset{/pgf/data/continue code=\tikz@lib@dv@parse@loop}% % Now enter parse loop \tikz@lib@dv@parse@loop }% \def\tikz@lib@dv@parse@loop{% \pgfutil@ifnextchar d\tikz@lib@dv@handle@data{% \pgfutil@ifnextchar ;\tikz@lib@dv@parse@end{% \pgfutil@ifnextchar \par\tikz@lib@dv@handle@par{% \pgfutil@ifnextchar s\tikz@lib@dv@handle@beginscope{% \pgfutil@ifnextchar i\tikz@lib@dv@handle@info{% \pgfutil@ifnextchar [\tikz@lib@dv@handle@options{% \pgfutil@ifnextchar \egroup\tikz@lib@dv@handle@endscope{% \tikzerror{Semicolon expected}% \endgroup% }% }% }% }% }% }% }% }% \def\tikz@lib@dv@parse@end;{% % Go! \tikz@main@dv.survey()% \tikz@main@dv.visualize()% \endgroup% \tikz@path@do@at@end% }% \def\tikz@lib@dv@handle@par\par{\tikz@lib@dv@parse@loop}% \def\tikz@lib@dv@handle@options[#1]{% \tikzdatavisualizationset{#1}% \tikz@lib@dv@parse@loop% }% \def\tikz@lib@dv@handle@beginscope scope{% \begingroup% \pgfutil@ifnextchar[\tikz@lib@dv@beg@opt{\tikz@lib@dv@beg@opt[]}%} }% \def\tikz@lib@dv@beg@opt[#1]{% \pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}% \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\begingroup\pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}}})}% \pgfutil@ifnextchar\bgroup{ \afterassignment\tikz@lib@dv@parse@loop% \let\tikz@dummy=%get rid of \bgroup }{% \tikzerror{Opening brace expected}% \tikz@lib@dv@parse@loop% }% }% \def\tikz@lib@dv@handle@endscope{% \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data(\endgroup)}% \endgroup% \afterassignment\tikz@lib@dv@parse@loop% \let\tikz@dummy=%get rid of \egroup }% \def\tikz@lib@dv@handle@data data{% \pgfutil@ifnextchar g{\tikz@lib@dv@handle@data@group}{% \pgfutil@ifnextchar p{\tikz@lib@dv@handle@data@point}{% \pgfdata}}}% \def\tikz@lib@dv@handle@data@group group{\pgfutil@ifnextchar[{\tikz@lib@dv@handle@data@group@opt}{\tikz@lib@dv@handle@data@group@opt[]}}%}% \def\tikz@lib@dv@handle@data@group@opt[#1]#2{% \pgfutil@ifnextchar={\tikz@lib@dv@handle@data@group@def{#1}{#2}}{% \pgfutil@ifnextchar+{\tikz@lib@dv@handle@data@group@extend{#1}{#2}}{% \tikz@lib@dv@handle@data@group@use{#1}{#2}}}}% \def\tikz@lib@dv@handle@data@group@def#1#2={% \pgfkeys{/pgf/data/new group=#2}% \tikz@lib@dv@handle@data@group@extend{#1}{#2}+=% }% \def\tikz@lib@dv@handle@data@group@extend#1#2+={% \pgfutil@ifnextchar\bgroup{ \begingroup% \pgfkeys{/pgf/data/store in group=#2}% \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\begingroup\pgfkeys{/pgf/data/.cd,/pgf/every data/.try,#1}}})}% \afterassignment\tikz@lib@dv@parse@loop% \let\tikz@dummy=%get rid of \bgroup }{% \tikzerror{Opening brace expected}% \tikz@lib@dv@parse@loop% }% }% \def\tikz@lib@dv@handle@data@group@use#1#2{% \pgfdata[#1,use group=#2]% }% \def\tikz@lib@dv@handle@data@point point{\pgfutil@ifnextchar[{\tikz@lib@dv@handle@data@point@opt}{\tikz@lib@dv@handle@data@point@opt[]}}%]% \def\tikz@lib@dv@handle@data@point@opt[#1]{% \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\bgroup\pgfkeys{/data point/.cd,#1}\pgfdatapoint\egroup}})}% \tikz@lib@dv@parse@loop% }% \def\tikz@lib@dv@handle@info info{% \pgfutil@ifnextchar'{\tikz@lib@dv@handle@info@prime}{\tikz@lib@dv@handle@info@noprime}}% \def\tikz@lib@dv@handle@info@noprime{% \pgfutil@ifnextchar[{\tikz@lib@dv@handle@info@block@opt}{\tikz@lib@dv@handle@info@block@opt[]}}%}% \def\tikz@lib@dv@handle@info@block@opt[#1]#2{% \tikz@main@dv.after visualization({\scope[#1]#2\endscope})% \tikz@lib@dv@parse@loop }% \def\tikz@lib@dv@handle@info@prime'{% \pgfutil@ifnextchar[{\tikz@lib@dv@handle@info@block@opt@prime}{\tikz@lib@dv@handle@info@block@opt@prime[]}}%}% \def\tikz@lib@dv@handle@info@block@opt@prime[#1]#2{% \tikz@main@dv.before visualization({\scope[#1]#2\endscope})% \tikz@lib@dv@parse@loop }% \pgfset{/pgf/every data/.style={/tikz/every data/.try,/tikz/data visualization/every data/.try}}% % % Performing before/after stuff via keys % \tikzdatavisualizationset{ before survey/.code=\tikz@main@dv.before survey({#1}), after survey/.code=\tikz@main@dv.after survey({#1}), before visualization/.code=\tikz@main@dv.before visualization({#1}), after visualization/.code=\tikz@main@dv.after visualization({#1}), at start survey/.code=\tikz@main@dv.at start survey({#1}), at end survey/.code=\tikz@main@dv.at end survey({#1}), at start visualization/.code=\tikz@main@dv.at start visualization({#1}), at end visualization/.code=\tikz@main@dv.at end visualization({#1}), }% \def\tikz@lib@dv@alias@dv@bb{ \pgfnodealias{data bounding box}{data visualization bounding box}% \pgfkeys{/pgf/freeze local bounding box=data bounding box}% }% % % The data point key % \tikzdatavisualizationset{ data point/.code={ \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data({{\bgroup\pgfkeys{/data point/.cd,#1}\pgfdatapoint\egroup}})}% } }% % % Object setup % % The following key is used to create objects for the rendering % pipeline. They cannot be created "directly" because when it is known % that the objects needs to be created, in principle, many keys may % not yet be known. % % The following options are used: % % store = key that will store the object (handle) % class = class of the object % arg1 = argument1 of the constructor % ... % arg8 = argument8 of the constructor % when = specifies when the object will be created. Defaults to % "before survey", other possible values are "after survey" and % "before/after visualization" % before creation = code to be executed just before the object is % created % after creation = code to be executed just after the object has been created % % The following styles may be useful: % % arg1 from key = use the contents of the given key as arg1. Similar % for other args % arg1 handle from key = the contents of the given key should contain % an object. Then arg1 will be a handle to this % object. Similar for other args \tikzdatavisualizationset{% new object/.code={% \def\tikz@dv@grabbed@when{before survey}% \let\tikz@dv@grabbed@store\pgfutil@empty \pgfkeys{/tikz/data visualization/new object/grab/.cd,#1}% \ifx\tikz@dv@grabbed@store\pgfutil@empty \else \pgfkeyslet{\tikz@dv@grabbed@store}\pgfutil@empty% \fi \edef\tikz@marshal{\noexpand\tikz@main@dv.\tikz@dv@grabbed@when(\noexpand\tikz@dv@newobject{\tikz@dv@grabbed@store}}% \tikz@marshal{#1})% }, new object/grab/store/.store in=\tikz@dv@grabbed@store, new object/grab/when/.store in=\tikz@dv@grabbed@when, new object/grab/.unknown/.code={},%ignore }% \def\tikz@dv@newobject#1#2{% \def\tikz@dv@new@obj@store{#1}% \ifx\tikz@dv@new@obj@store\pgfutil@empty% \let\tikz@dv@new@obj=\pgfutil@empty% \else% \pgfkeysgetvalue\tikz@dv@new@obj@store\tikz@dv@new@obj% \fi% \ifx\tikz@dv@new@obj\pgfutil@empty \let\tikz@dv@arg@a=\tikz@lib@notused% \let\tikz@dv@arg@b=\tikz@lib@notused% \let\tikz@dv@arg@c=\tikz@lib@notused% \let\tikz@dv@arg@d=\tikz@lib@notused% \let\tikz@dv@arg@e=\tikz@lib@notused% \let\tikz@dv@arg@f=\tikz@lib@notused% \let\tikz@dv@arg@g=\tikz@lib@notused% \let\tikz@dv@arg@h=\tikz@lib@notused% \let\tikz@dv@new@after=\relax% \pgfkeys{/tikz/data visualization/new object/parse/.cd,#2} \edef\pgf@marshal{\noexpand\pgfoonew\noexpand\tikzdvobj=new \tikz@dv@new@class(}% \tikz@dv@add@arg{}\tikz@dv@arg@a% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@b% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@c% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@d% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@e% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@f% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@g% \tikz@dv@add@arg{\expandafter,}\tikz@dv@arg@h% \expandafter\def\expandafter\pgf@marshal\expandafter{\pgf@marshal)}% \pgf@marshal% \tikzdvobj.default connects()% \ifx\tikz@dv@new@obj@store\pgfutil@empty% \else% \pgfkeyslet\tikz@dv@new@obj@store\tikzdvobj% \fi% \tikz@dv@new@after% \fi }% \def\tikz@lib@notused{\tikz@lib@notused}% \def\tikz@dv@add@arg#1#2{% \ifx#2\tikz@lib@notused% \else% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\pgf@marshal% \expandafter\expandafter\expandafter{\expandafter\pgf@marshal#1#2}% \fi% }% \tikzdatavisualizationset{% new object/parse/.cd, store/.code=,% ignore when/.code=,% ignore class/.store in=\tikz@dv@new@class, before creation/.code=#1, after creation/.store in=\tikz@dv@new@after, arg1/.store in=\tikz@dv@arg@a, arg2/.store in=\tikz@dv@arg@b, arg3/.store in=\tikz@dv@arg@c, arg4/.store in=\tikz@dv@arg@d, arg5/.store in=\tikz@dv@arg@e, arg6/.store in=\tikz@dv@arg@f, arg7/.store in=\tikz@dv@arg@g, arg8/.store in=\tikz@dv@arg@h, arg1 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@a}, arg2 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@b}, arg3 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@c}, arg4 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@d}, arg5 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@e}, arg6 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@f}, arg7 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@g}, arg8 from key/.code=\pgfkeysgetvalue{#1}{\tikz@dv@arg@h} arg1 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@a}{\tikz@dv@arg@a}, arg2 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@b}{\tikz@dv@arg@b}, arg3 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@c}{\tikz@dv@arg@c}, arg4 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@d}{\tikz@dv@arg@d}, arg5 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@e}{\tikz@dv@arg@e}, arg6 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@f}{\tikz@dv@arg@f}, arg7 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@g}{\tikz@dv@arg@g}, arg8 handle from key/.code=\tikz@dv@handle@from@key{#1}{\tikz@dv@handle@h}{\tikz@dv@arg@h} }% \def\tikz@dv@handle@from@key#1#2#3{% \pgfkeysvalueof{#1}.get handle(#2)% \def#3{#2}% }% % % Data visualization coordinate system % % % This cs is used to refer to points in a datavisualization. The % parameters are keys that are set in the /data point key % directory. Then, a (virtual) data point is created and the % calculated position is returned \tikzdeclarecoordinatesystem{visualization} {% \tikzset{/data point/.cd,#1}% \pgfpointdvlocaldatapoint% }% % % % Axes % % % % Axis base % \tikzdatavisualizationset{% new axis base/.style={ new object={ class=scaling mapper, store=/tikz/data visualization/#1/scaling mapper, before creation={ \pgfkeysgetvalue{/tikz/data visualization/#1/scaling}\tikz@temp \ifx\tikz@temp\pgfutil@empty% \pgfkeysgetvalue{/tikz/data visualization/#1/scaling/default}\tikz@temp \fi \expandafter\tikz@dv@lib@parse@scaling\tikz@temp\pgf@stop% \pgfkeyslet{/tikz/data visualization/#1/scaling}\tikz@temp }, arg1 from key=/tikz/data visualization/#1/attribute, arg2/.expanded=\pgfkeysvalueof{/tikz/data visualization/#1/attribute}/scaled, arg3 from key=/tikz/data visualization/#1/scaling, arg4 from key=/tikz/data visualization/#1/function }, #1/attribute/.initial=#1, #1/function/.initial=, #1/scaling/.initial=, #1/scaling/default/.initial=0 at 0 and 1 at 1, #1/ticks at/.initial=, #1/default ticks at/.initial=, #1/major ticks/.initial=, #1/minor ticks/.initial=, #1/subminor ticks/.initial=, #1/grid at/.initial=, #1/default grid at/.initial=, #1/major grid/.initial=, #1/minor grid/.initial=, #1/subminor grid/.initial=, #1/label/.initial=, #1/padding min/.initial=, #1/padding max/.initial=, #1/.code={ \let\tikz@temp\tikz@dv@axis% \def\tikz@dv@axis{/tikz/data visualization/#1}% \expandafter\tikz@do@axis@options\expandafter{\tikz@temp}{##1}% }, #1/@compute at positions/.initial=\tikz@lib@dv@compute@at@linear, axes list/.append={\tikz@lib@dv@do@axis{#1}} }, all axes/.code={ \def\tikz@lib@dv@args{#1}% \pgfkeysvalueof{/tikz/data visualization/axes list}% }, % General styling styling/.style=, style/.style={styling/.append style={#1}}, @node styling/.initial=, node styling/.style={% /utils/exec={\pgfkeysgetvalue{/tikz/data visualization/@node styling}\tikz@temp\expandafter\tikzset\expandafter{\tikz@temp}}}, node style/.style={/tikz/data visualization/@node styling/.append={,#1}}, % General extends (both axes, grid and ticks) low/.initial=0, high/.initial=0, padded/.style={low=padded min,high=padded max}, tick length/.style={low={-#1},high={#1}}, % General tick and grid keys: common/.initial=, major/.initial=, minor/.initial=, subminor/.initial=, @setup at setters/.style={ common/.code=\tikz@lib@dv@add@{common}{##1}, major/.code=\tikz@lib@dv@add@{major}{##1}, minor/.code=\tikz@lib@dv@add@{minor}{##1}, subminor/.code=\tikz@lib@dv@add@{subminor}{##1} }, @setup at setters, % Tick keys direction axis/.initial=, % Tick text modifiers tick text low even padding/.initial=0pt, tick text high even padding/.initial=0pt, tick text low odd padding/.initial=0pt, tick text high odd padding/.initial=0pt, tick text odd padding/.style={tick text low odd padding={-#1},tick text high odd padding={#1}}, tick text even padding/.style={tick text low even padding={-#1},tick text high even padding={#1}}, tick text padding/.style={tick text odd padding={#1},tick text even padding={#1}}, stack/.style={tick text even padding={#1}}, stack'/.style={tick text odd padding={#1}}, stack/.default=1em, stack'/.default=1em, tick text at low/.is if=tikz@dv@min@tick@node, tick text at high/.is if=tikz@dv@max@tick@node, no tick text/.style={tick text at low=false,tick text at high=false}, % every major ticks/.style={style={line cap=round},tick length=2pt}, every minor ticks/.style={style={solid, help lines,thin,line cap=round},tick length=1.4pt}, every subminor ticks/.style={style={solid, help lines,line cap=round},tick length=0.8pt}, clean ticks/.style={node style={fill=white}}, % Default grid styles every grid/.style={high=max,low=min}, every major grid/.style={style={solid, help lines,thin,black!25}}, every minor grid/.style={style={solid, help lines,black!25}}, every subminor grid/.style={style={solid, help lines,black!10}}, at default ticks/.code={% \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@default@at}}, at ticks/.code={% \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@default@at}% \expandafter\pgfkeysalso\expandafter{\tikz@lib@dv@ticks@at}}, }% \def\tikz@lib@dv@add@#1#2{\pgfkeysaddvalue{/tikz/data visualization/#1}{}{,#2}}% \def\tikz@dv@lib@parse@scaling#1 at#2and #3 at#4\pgf@stop{% \pgfmathsetmacro{\tikz@dv@lib@min@at}{#2} \pgfmathsetmacro{\tikz@dv@lib@max@at}{#4} \edef\tikz@temp{#1 at \tikz@dv@lib@min@at and #3 at \tikz@dv@lib@max@at}% }% % Ticks at \tikzdatavisualizationset{ at/.code={\def\tikz@dv@at@list{#1}}, also at/.code={\expandafter\def\expandafter\tikz@dv@at@list\expandafter{\tikz@dv@at@list,#1}}, major at/.style={major={at={#1}}}, minor at/.style={minor={at={#1}}}, subminor at/.style={subminor={at={#1}}}, major also at/.style={major={also at={#1}}}, minor also at/.style={minor={also at={#1}}}, subminor also at/.style={subminor={also at={#1}}}, options at/.code={\expandafter\def\expandafter\tikz@dv@style@at@list\expandafter{\tikz@dv@style@at@list,{#1}}}, no tick text at/.style={options at={#1 as [no tick text]}} }% \def\tikz@lib@dv@do@axis#1{% \def\tikz@marshal{#1=} \expandafter\expandafter\expandafter\tikzdatavisualizationset% \expandafter\expandafter\expandafter{\expandafter\tikz@marshal\expandafter{\tikz@lib@dv@args}} }% \def\tikz@do@axis@options#1#2{ \pgfkeys{/tikz/data visualization/axis options/.cd,#2} \def\tikz@dv@axis{#1} }% \let\tikz@dv@axis\pgfutil@empty \tikzdatavisualizationset{ every ticks/.style={ node style={% font=\pgfutil@font@footnotesize, inner sep=1pt, outer sep=.1666em, rounded corners=1.5pt } }, every data set label/.style={ every ticks, node style={ font=\pgfutil@font@small, } }, @color of visualizer labels/.style={text=black}, every label in legend/.style={ node style={ fill=none, } }, every axis label/.style={ node style={% font=\pgfutil@font@small, } } }% \tikzset{ /tikz/data visualization/axis options/.cd, % % Basic setters % attribute/.style={\tikz@dv@axis/attribute={#1}}, function/.style={\tikz@dv@axis/function={#1}}, scaling/.style={\tikz@dv@axis/scaling={#1}}, padding min/.style={\tikz@dv@axis/padding min={#1}}, padding max/.style={\tikz@dv@axis/padding max={#1}}, padding/.style={padding min={-#1},padding max={#1}}, label/.code={% \def\pgf@temp{#1}% \ifx\pgf@temp\tikz@lib@dv@auto@attribute% \tikzdatavisualizationset{\tikz@dv@axis/label/.expanded=$\noexpand\mathit{\pgfkeysvalueof{\tikz@dv@axis/attribute}}$}% \else \tikzdatavisualizationset{\tikz@dv@axis/label={#1}}% \fi }, label/.default=\tikz@lib@dv@auto@attribute, % % Strategies % tick placement strategy/.style={\tikz@dv@axis/@compute at positions={#1}}, linear steps/.style={tick placement strategy=\tikz@lib@dv@compute@at@linear}, % % Attribute setter % goto/.code={\tikz@dv@goto{\tikz@dv@axis}{#1}}, goto pos/.code={\tikz@dv@goto@pos{\tikz@dv@axis}{#1}}, anchor at min/.code={\tikz@lib@dv@special@at{\tikz@dv@axis}{\tikz@dv@min@anchor}}, anchor at max/.code={\tikz@lib@dv@special@at{\tikz@dv@axis}{\tikz@dv@max@anchor}}, % % Visualization setters % visualize axis/.code=\expandafter\tikz@lib@dv@av\expandafter{\tikz@dv@axis}{#1}, % % Ticks settings % ticks/.style={\tikz@dv@axis/ticks at/.append={,#1}}, ticks/.default=some, visualize ticks/.code=\expandafter\tikz@lib@dv@tv\expandafter{\tikz@dv@axis}{#1}, % % Grid settings % grid/.style={\tikz@dv@axis/grid at/.append={,#1}}, grid/.default=at default ticks, visualize grid/.code=\expandafter\tikz@lib@dv@gv\expandafter{\tikz@dv@axis}{#1}, % ticks and grid/.style={\tikz@dv@axis/ticks at/.append={,#1},\tikz@dv@axis/grid at/.append={,#1}}, % % Visualizing axis labels % visualize label/.code=\expandafter\tikz@lib@dv@lv\expandafter{\tikz@dv@axis}{#1}, }% \def\tikz@lib@dv@auto@attribute{\tikz@lib@dv@auto@attribute}% % Range options \tikzdatavisualizationset{ axis options/.cd, % % Including a value in the range % include value/.style={% /tikz/data visualization/before survey/.expanded={% \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper% \noexpand\foreach \noexpand\tikz@lib@dv@temp in {#1} {% \noexpand\tikz@dv@axis@mapper.include in value(\noexpand\tikz@lib@dv@temp)% }% }% }, % % Directly setting the min or max % min value/.style={ /tikz/data visualization/at end survey/.expanded={% \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper% \noexpand\tikz@lib@dv@set\noexpand\tikz@dv@axis@mapper{#1}{min}% } }, max value/.style={ /tikz/data visualization/at end survey/.expanded={% \noexpand\pgfkeysgetvalue{\tikz@dv@axis/scaling mapper}\noexpand\tikz@dv@axis@mapper% \noexpand\tikz@lib@dv@set\noexpand\tikz@dv@axis@mapper{#1}{max}% } }, }% \def\tikz@lib@dv@set#1#2#3{% \pgfdvmathenter{\pgf@dv@value}{#2}% #1.get in range interval()% \pgfdvinrangeinterval.let #3(\pgf@dv@value)% }% % Layer options \tikzdatavisualizationset{ axis layer/.style=on background layer, ticks layer/.style=on background layer, ticks node layer/.style=, grid layer/.style=on background layer, }% % Axis visualization % % #1 = name of the to-be-visualized axis name % #2 = options for the visualization \def\tikz@lib@dv@av#1#2{ \tikzdatavisualizationset{ axes actions/.append={\tikz@lib@dv@show@axis{#1}{#2}} } }% \def\tikz@lib@dv@show@axis#1#2{% \scope[data visualization/axis layer,/tikz/data visualization/.cd,low=min,high=max,every axis/.try,#2] \pgfkeysgetvalue{#1/scaling mapper}\tikz@dv@axis@mapper% % Ok, calculate direction vector: \tikzpointandanchordirection{\tikz@dv@axis@mapper.set in to(min)}{\tikz@dv@axis@mapper.set in to(max)} \xdef\tikz@dv@axis@dir{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} \path[draw,/tikz/data visualization/styling] \pgfextra{ { \tikz@dv@goto{#1}{\pgfkeysvalueof{/tikz/data visualization/low}}% \pgfpathdvmoveto% } { \tikz@dv@goto{#1}{\pgfkeysvalueof{/tikz/data visualization/high}}% \pgfpathdvlineto% } }; \endscope }% \def\tikz@dv@goto#1#2{% \edef\pgf@@temp{#2}% \ifx\pgf@@temp\tikz@lib@dv@padded@min@text% \pgfkeysvalueof{#1/scaling mapper}.set in to(min)% \pgfkeysvalueof{#1/scaling mapper}.get out()% \pgfkeysgetvalue{#1/padding min}\pgf@temp% \pgfmathparse{\pgf@temp}% \pgfkeyslet{/data point/\pgfdvout/offset}\pgfmathresult% \else% \ifx\pgf@@temp\tikz@lib@dv@padded@max@text% \pgfkeysvalueof{#1/scaling mapper}.set in to(max)% \pgfkeysvalueof{#1/scaling mapper}.get out()% \pgfkeysgetvalue{#1/padding max}\pgf@temp% \pgfmathparse{\pgf@temp}% \pgfkeyslet{/data point/\pgfdvout/offset}\pgfmathresult% \else% \pgfkeysvalueof{#1/scaling mapper}.set in to(#2)% \fi% \fi% }% \def\tikz@dv@goto@pos#1#2{% \pgfkeyssetvalue{/data point/\pgfkeysvalueof{#1/attribute}/out pos}{#2}% }% \def\tikz@lib@dv@padded@min@text{padded min}% \def\tikz@lib@dv@padded@max@text{padded max}% \def\tikz@lib@dv@special@at#1#2{% % Ok, calculate direction vector: \tikzpointandanchordirection{\pgfkeysvalueof{#1/scaling mapper}.set in to(min)}{\pgfkeysvalueof{#1/scaling mapper}.set in to(max)} \tikzset{anchor/.expanded=#2} }% % Ticks visualization % % #1 = name of axis on which ticks should be shown % #2 = options for the visualization \def\tikz@lib@dv@tv#1#2{ \tikzdatavisualizationset{ ticks actions/.append={\tikz@lib@dv@default@action{ticks}{#1}{#2}}, major ticks actions/.append={\tikz@lib@dv@show@ticks{major}{#1}{#2}}, minor ticks actions/.append={\tikz@lib@dv@show@ticks{minor}{#1}{#2}}, subminor ticks actions/.append={\tikz@lib@dv@show@ticks{subminor}{#1}{#2}} } }% \def\tikz@lib@dv@default@action#1#2#3{% \let\tikz@marshal\pgfutil@empty% {% \let\tikz@lib@dv@ticks@at\pgfutil@empty% \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@ticks@default@at% \pgfkeysgetvalue{#2/#1 at}\tikz@lib@dv@settings% \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper % Normal minor etc. have no effect. \tikzdatavisualizationset{major/.code=,minor/.code=,subminor/.code=,common/.code=} \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}% \tikzdatavisualizationset{@setup at setters}% \pgfkeysgetvalue{/tikz/data visualization/compute step}\tikz@temp@step% \ifx\tikz@temp@step\pgfutil@empty% % do nothing \else% \pgfkeysvalueof{#2/@compute at positions}% \xdef\tikz@marshal{ major={\pgfkeysvalueof{/tikz/data visualization/major}}, minor={\pgfkeysvalueof{/tikz/data visualization/minor}}, subminor={\pgfkeysvalueof{/tikz/data visualization/subminor}}} \fi }% \pgfkeyslet{#2/default #1 at}\tikz@marshal }% \def\tikz@lib@dv@show@ticks#1#2#3{% % First, check whether there is anything to do at all: \pgfkeysgetvalue{#2/default ticks at}\tikz@lib@dv@default@settings% \ifx\tikz@lib@dv@default@settings\pgfutil@empty% \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@settings% \else% \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@settings% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\tikz@lib@dv@settings% \expandafter\expandafter\expandafter{\expandafter\tikz@lib@dv@default@settings\expandafter,\tikz@lib@dv@settings} \fi% \ifx\tikz@lib@dv@settings\pgfutil@empty% % Great, nothing to do \else {% \let\tikz@dv@at@list\pgfutil@empty% \let\tikz@dv@style@at@list\pgfutil@empty% \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper \scope[/tikz/data visualization/.cd,every ticks/.try,every #1 ticks/.try,#3]% % Setup options \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}% \pgfkeysgetvalue{/tikz/data visualization/common}\tikz@temp \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp} \pgfkeysgetvalue{/tikz/data visualization/#1}\tikz@temp \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp} \pgfkeysgetvalue{/tikz/data visualization/\pgfkeysvalueof{/tikz/data visualization/direction axis}/scaling mapper}\pgf@dv@tick@dir@mapper % Ok, now it's time to draw the ticks! \foreach \tikz@dv@tick@pos[count=\tikz@dv@tick@count] in \tikz@dv@at@list { \ifx\tikz@dv@tick@pos\pgfutil@empty \c@pgf@counta=\tikz@dv@tick@count\relax% \advance\c@pgf@counta by-1\relax% \edef\tikz@dv@tick@count{\the\c@pgf@counta}% \else \expandafter\tikz@lib@dv@parse\tikz@dv@tick@pos\pgf@stop% \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@tick@opt}% \tikz@lib@dv@mapper.set in to(\tikz@dv@tick@pos)% % First, compute position of tick: \pgf@process{\pgfpointdvlocaldatapoint} \xdef\pgf@dv@tick@origin{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} % Ok, calculate direction vector: \tikzpointandanchordirection{\pgf@dv@tick@dir@mapper.set in to(min)}{\pgf@dv@tick@dir@mapper.set in to(max)} \xdef\pgf@dv@tick@dir{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} % Now, show something: \tikz@lib@handle@at@style% \pgfkeysgetvalue{/tikz/data visualization/high}\tikz@dv@max@val% \pgfkeysgetvalue{/tikz/data visualization/low}\tikz@dv@min@val% \iftikz@dv@max@tick@node\pgfmathsetmacro\tikz@dv@max@val{% \tikz@dv@max@val+(\pgfkeysvalueof{% /tikz/data visualization/tick text high \ifodd\tikz@dv@tick@count odd \else even \fi padding}% )}% \fi% \iftikz@dv@min@tick@node\pgfmathsetmacro\tikz@dv@min@val{% \tikz@dv@min@val+(\pgfkeysvalueof{% /tikz/data visualization/tick text low \ifodd\tikz@dv@tick@count odd \else even \fi padding}% )}% \fi% \pgf@process{\pgfpointadd{\pgf@dv@tick@origin}{\pgfpointscale{\tikz@dv@max@val}{\pgf@dv@tick@dir}}} \xdef\tikz@dv@max@tick{\the\pgf@x,\the\pgf@y} \pgf@process{\pgfpointadd{\pgf@dv@tick@origin}{\pgfpointscale{\tikz@dv@min@val}{\pgf@dv@tick@dir}}} \xdef\tikz@dv@min@tick{\the\pgf@x,\the\pgf@y} \scope[data visualization/ticks layer] \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try} \draw [/tikz/data visualization/styling] (\tikz@dv@min@tick) -- (\tikz@dv@max@tick); \endscope \iftikz@dv@min@tick@node \scope[data visualization/ticks node layer] \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try} \path [/tikz/data visualization/styling] (\tikz@dv@min@tick) \tikz@dv@handle@tick{\tikz@dv@min@anchor}; \endscope \fi \iftikz@dv@max@tick@node \scope[data visualization/ticks node layer] \tikzdatavisualizationset{every \ifodd\tikz@dv@tick@count odd \else even \fi tick/.try} \path [/tikz/data visualization/styling] (\tikz@dv@max@tick) \tikz@dv@handle@tick{\tikz@dv@max@anchor}; \endscope \fi \fi } \endscope } \fi }% \def\tikz@lib@dv@parse#1\pgf@stop{% \pgfutil@in@{as}{#1}% \ifpgfutil@in@% \tikz@lib@dv@parse@as#1\pgf@stop% \else% \tikz@lib@dv@parse@as#1as\tikz@lib@dv@typeset\pgf@stop% \fi% }% \def\tikz@lib@dv@parse@as#1as{% \def\tikz@dv@tick@pos{#1}% \pgfutil@ifnextchar[{\tikz@lib@dv@parse@as@opt}{\tikz@lib@dv@parse@as@opt[]}%] }% \def\tikz@lib@dv@parse@as@opt[#1]{% \def\tikz@lib@dv@tick@opt{#1}% \pgfutil@ifnextchar\pgf@stop{\tikz@lib@dv@parse@as@text\tikz@lib@dv@typeset}{\tikz@lib@dv@parse@as@text} }% \def\tikz@lib@dv@parse@as@text#1\pgf@stop{% \def\tikz@lib@dv@tick@text{#1}% }% \def\tikz@lib@dv@typeset{% \pgfdvmathenter{\tikz@lib@dv@typesetnum}{\tikz@dv@tick@pos}% \pgfdvmathexitbyscientificformat{\tikz@lib@dv@typesetnum}{\tikz@lib@dv@typesetnum}% hmm... not sure about this... \pgfkeysvalueof{/tikz/data visualization/tick prefix}% \pgfkeys{/tikz/data visualization/tick typesetter=\tikz@lib@dv@typesetnum}% \pgfkeysvalueof{/tikz/data visualization/tick suffix}% }% \newif\iftikz@dv@min@tick@node \newif\iftikz@dv@max@tick@node \def\tikz@dv@handle@tick#1{% \pgfextra{ \ifx\tikz@lib@dv@tick@text\pgfutil@empty% \global\let\tikz@dv@tick@marshal=\pgfutil@empty% Skip! \else \def\tikz@dv@tick@marshal{node[anchor=#1,/tikz/data visualization/node styling]}% \expandafter\pgfutil@g@addto@macro\expandafter\tikz@dv@tick@marshal\expandafter{\expandafter{\tikz@lib@dv@tick@text}} \fi \expandafter}% \tikz@dv@tick@marshal }% \def\tikz@lib@handle@at@style{% \ifx\tikz@dv@style@at@list\pgfutil@empty% nothing to do \else% \let\tikz@dv@lib@this@at@style=\pgfutil@empty% \pgfdvmathenter{\tikz@temp}{\tikz@dv@tick@pos}% \pgfdvmathexitbyscientificformat{\tikz@dv@compare@to}{\tikz@temp}% \foreach \tikz@dv@at@style in \tikz@dv@style@at@list {% \ifx\tikz@dv@at@style\pgfutil@empty% \else% \expandafter\tikz@dv@lib@handle@one@at@style\tikz@dv@at@style\tikz@stop% \fi% } \ifx\tikz@dv@lib@this@at@style\pgfutil@empty% \else% \expandafter\tikzdatavisualizationset\expandafter{\tikz@dv@lib@this@at@style}% \fi% \fi% }% \def\tikz@dv@lib@handle@one@at@style#1as#2[#3]#4\tikz@stop{% \pgfdvmathenter{\tikz@lib@dv@at@math@var}{#1}% \pgfdvmathexitbyscientificformat{\tikz@dv@temp}{\tikz@lib@dv@at@math@var}% \ifx\tikz@dv@temp\tikz@dv@compare@to% % Bingo! \expandafter\gdef\expandafter\tikz@dv@lib@this@at@style\expandafter{\tikz@dv@lib@this@at@style,#3}% \fi% }% % Help function \def\tikzpointandanchordirection#1#2{% % This function works like pgfpointdvdirection, but also computes % appropriate "min" and "max" anchors. \pgf@process{\pgfpointdvdirection{#1}{#2}} { \pgf@ya=\pgf@y \pgf@y=-\pgf@x \pgf@x=\pgf@ya \tikz@auto@anchor \xdef\tikz@dv@max@anchor{\tikz@anchor} \tikz@auto@anchor@prime \xdef\tikz@dv@min@anchor{\tikz@anchor} } }% % Grid visualization % % #1 = name of axis on which grid lines should be shown % #2 = options for the visualization \def\tikz@lib@dv@gv#1#2{ \tikzdatavisualizationset{ grid actions/.append={\tikz@lib@dv@default@action{grid}{#1}{#2}}, major grid actions/.append={\tikz@lib@dv@show@grid{major}{#1}{#2}}, minor grid actions/.append={\tikz@lib@dv@show@grid{minor}{#1}{#2}}, subminor grid actions/.append={\tikz@lib@dv@show@grid{subminor}{#1}{#2}}, } }% \def\tikz@lib@dv@show@grid#1#2#3{% % First, check whether there is anything to do at all: \pgfkeysgetvalue{#2/default grid at}\tikz@lib@dv@default@settings% \ifx\tikz@lib@dv@default@settings\pgfutil@empty% \pgfkeysgetvalue{#2/grid at}\tikz@lib@dv@settings% \else% \pgfkeysgetvalue{#2/grid at}\tikz@lib@dv@settings% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter\tikz@lib@dv@settings% \expandafter\expandafter\expandafter{\expandafter\tikz@lib@dv@default@settings\expandafter,\tikz@lib@dv@settings} \fi% \ifx\tikz@lib@dv@settings\pgfutil@empty% % Great, nothing to do \else {% \let\tikz@dv@at@list\pgfutil@empty \let\tikz@dv@style@at@list\pgfutil@empty \pgfkeysgetvalue{#2/scaling mapper}\tikz@lib@dv@mapper \let\tikz@lib@dv@ticks@default@at\pgfutil@empty% \scope[data visualization/grid layer,/tikz/data visualization/.cd,every #1 grid/.try,every grid,#3] % Setup options \pgfkeysgetvalue{#2/ticks at}\tikz@lib@dv@ticks@at% \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@settings}% \pgfkeysgetvalue{/tikz/data visualization/common}\tikz@temp \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp} \pgfkeysgetvalue{/tikz/data visualization/#1}\tikz@temp \expandafter\tikzdatavisualizationset\expandafter{\tikz@temp} \edef\tikz@lib@dv@dir@axis{/tikz/data visualization/\pgfkeysvalueof{/tikz/data visualization/direction axis}}% % Ok, now it's time to draw the grid! \foreach \tikz@dv@grid@pos in \tikz@dv@at@list { \ifx\tikz@dv@grid@pos\pgfutil@empty \else \expandafter\tikz@lib@dv@parse\tikz@dv@grid@pos\pgf@stop% \expandafter\tikzdatavisualizationset\expandafter{\tikz@lib@dv@tick@opt}% \tikz@lib@dv@mapper.set in to(\tikz@dv@tick@pos)% \draw[/tikz/data visualization/styling] \pgfextra{ % First, compute start of grid: \tikz@dv@goto{\tikz@lib@dv@dir@axis}{\pgfkeysvalueof{/tikz/data visualization/low}}% \pgfpathdvmoveto% \tikz@dv@goto{\tikz@lib@dv@dir@axis}{\pgfkeysvalueof{/tikz/data visualization/high}}% \pgfpathdvlineto% }; \fi } \endscope } \fi }% % % Label visualization % \def\tikz@lib@dv@lv#1#2{ \tikzdatavisualizationset{ label actions/.append={\tikz@lib@dv@show@label{#1}{#2}} } }% \def\tikz@lib@dv@show@label#1#2{% % First, check whether there is anything to do at all: \pgfkeysgetvalue{#1/label}\tikz@dv@lib@label% \ifx\tikz@dv@lib@label\pgfutil@empty% % Great, nothing to do \else \scope[anchor=center,/tikz/data visualization/.cd,every axis label/.try,#2] \expandafter\tikz@lib@dv@parse@node\tikz@dv@lib@label\pgf@stop \endscope \fi }% \def\tikz@lib@dv@parse@node{\pgfutil@ifnextchar[\tikz@lib@dv@parse@node@opt{\tikz@lib@dv@parse@node@opt[]}}%}% \def\tikz@lib@dv@parse@node@opt[#1]#2\pgf@stop{ \tikzdatavisualizationset{#1} \pgftransformshift{\pgfpointdvlocaldatapoint}% \node [/tikz/data visualization/node styling] {#2}; }% % % Tick placement strategies % \tikzdatavisualizationset{ compute step/.initial=, step/.style={compute step=\def\tikz@lib@dv@step{#1}}, minor steps between steps/.initial=, minor steps between steps/.default=9, phase/.initial=0, tick typesetter/.code=\pgfmathprintnumber{#1}, tick prefix/.initial=, tick suffix/.initial=, tick unit/.style={tick suffix={$\,\pgfutil@font@normalfont#1$}},% this is an alias }% \def\tikz@lib@dv@compute@at@linear{% % Setup about: \let\tikz@lib@dv@compute@about=\tikz@lib@dv@about@linear% \let\tikz@lib@dv@step\relax% \pgfkeysvalueof{/tikz/data visualization/compute step} \ifx\tikz@lib@dv@step\relax% \else% % Gather interesting values \tikz@lib@dv@mapper.get in range interval()% \pgfdvinrangeinterval.get min and max()% \pgfkeysgetvalue{/tikz/data visualization/phase}\tikz@temp \pgfdvmathenter{\tikz@dv@lib@phase}{\tikz@temp} \pgfdvmathenter{\tikz@dv@lib@step}{\tikz@lib@dv@step} \pgfdvmathifless{\pgfdvmathalwayszero}{\tikz@dv@lib@step}{% % Compute start: \pgfdvmathsub{\tikz@dv@lib@temp}{\pgfdvmin}{\tikz@dv@lib@phase}% temp = dvmin - phase \pgfdvmathdiv{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% temp = temp/step \pgfdvmathfloor{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}% temp = floor(temp) \pgfdvmathmul{\tikz@lib@dv@current}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% current = temp*step ... \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@phase}% + phase \let\tikz@lib@dv@ats\pgfutil@empty% \let\tikz@lib@dv@minor@ats\pgfutil@empty% \tikz@lib@dv@mapper.get function(\tikz@temp)% \ifx\tikz@temp\pgfutil@empty% \pgfdvmathenter{\tikz@one@hundreth}{0.001}% \pgfdvmathsub{\tikz@lib@temp}{\pgfdvmax}{\pgfdvmin}% \pgfdvmathmul{\tikz@lib@dv@epsilon}{\tikz@lib@temp}{\tikz@one@hundreth}% epsilon = (max - min)/1000 \else \let\tikz@lib@dv@epsilon\pgfdvmathalwayszero \fi \pgfdvmathsub{\tikz@lib@dv@min@minus@epsilon}{\pgfdvmin}{\tikz@lib@dv@epsilon}% \pgfdvmathadd{\tikz@lib@dv@max@plus@epsilon}{\pgfdvmax}{\tikz@lib@dv@epsilon}% \pgfkeysgetvalue{/tikz/data visualization/minor steps between steps}\tikz@lib@dv@substeps% \ifx\tikz@lib@dv@substeps\pgfutil@empty \else \pgfmathsetmacro\tikz@temp{\tikz@lib@dv@substeps+1}% \pgfdvmathenter{\tikz@dv@lib@substeps}{\tikz@temp}% \pgfdvmathdiv{\tikz@lib@dv@substep}{\tikz@dv@lib@step}{\tikz@dv@lib@substeps}% \fi \loop% \ifx\tikz@lib@dv@substeps\pgfutil@empty% \else% \let\tikz@lib@dv@subcurrent=\tikz@lib@dv@current% \pgfmathsetcount{\c@pgf@counta}{\tikz@lib@dv@substeps}% \let\tikz@lib@dv@next=\tikz@lib@dv@subloop% \tikz@lib@dv@subloop \fi% \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@min@minus@epsilon}{}{% \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@current}% \edef\tikz@lib@dv@ats{\tikz@lib@dv@ats,\tikz@temp}% } \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@step}% \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@max@plus@epsilon}{\tikz@lib@dv@continuetrue}{\tikz@lib@dv@continuefalse}% \iftikz@lib@dv@continue% \repeat% \tikzdatavisualizationset{major/.expanded={at={\tikz@lib@dv@ats}},minor/.expanded={at={\tikz@lib@dv@minor@ats}}}% }{% \pgfdvmathexitbyserializing{\tikz@temp}{\pgfdvmin}% \tikzdatavisualizationset{major/.expanded={at={\tikz@temp}}}% }% \fi% }% \newif\iftikz@lib@dv@continue \def\tikz@lib@dv@subloop{ \pgfdvmathadd{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@substep}% \pgfdvmathifless{\tikz@lib@dv@subcurrent}{\pgfdvmin}{}{% \pgfdvmathifless{\tikz@lib@dv@subcurrent}{\pgfdvmax}{% \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@subcurrent}% \edef\tikz@lib@dv@minor@ats{\tikz@lib@dv@minor@ats,\tikz@temp} }{}} \advance\c@pgf@counta by-1\relax% \ifnum\c@pgf@counta=0\relax% \let\tikz@lib@dv@next=\relax \fi \tikz@lib@dv@next }% % % Ticks about settings % \tikzdatavisualizationset{ about/.style={compute step=\tikz@lib@dv@compute@about{#1}}, about strategy/.initial=, standard about strategy/.style={about strategy={1.5/1.0,2.3/2.0,4/2.5,7/5,11/10}}, standard about strategy, euro about strategy/.style={about strategy={1.5/1.0,3/2.0,7/5,11/10}}, decimal about strategy/.style={about strategy={3/1.0,11/10}}, half about strategy/.style={about strategy={2/1.0,7/5,11/10}}, quarter about strategy/.style={about strategy={1.8/1.0,4/2.5,7/5,11/10}}, int about strategy/.style={about strategy={1.5/1.0,2.5/2.0,3.5/3.0,4.5/4.0,7/5,11/10}}, none/.style={compute step=}, few/.style={about=3}, some/.style={about=5}, many/.style={about=10}, }% \def\tikz@lib@dv@about@linear#1{% \tikz@lib@dv@mapper.get in range interval()% \pgfdvinrangeinterval.get min and max()% \pgfdvmathsub{\tikz@lib@dv@diff}{\pgfdvmax}{\pgfdvmin} \pgfdvmathenter{\tikz@lib@dv@about@val}{#1}% \pgfdvmathdiv{\tikz@lib@dv@around}{\tikz@lib@dv@diff}{\tikz@lib@dv@about@val}% % Make mantisse sensible \pgfmathfloattomacro{\tikz@lib@dv@around}{\tikz@lib@dv@flags}{\tikz@lib@dv@mant}{\tikz@lib@dv@exp}% \pgf@xc=\tikz@lib@dv@mant pt % \pgfkeysgetvalue{/tikz/data visualization/about strategy}\tikz@lib@dv@strat \foreach \tikz@lib@dv@threshold/\tikz@lib@replace in \tikz@lib@dv@strat { \ifdim\pgf@xc<\tikz@lib@dv@threshold pt% \global\pgf@xc=\tikz@lib@replace pt% \breakforeach \fi }% \ifdim\pgf@xc<10pt% \pgfmathfloatcreate{\tikz@lib@dv@flags}{\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@dv@exp}% \else \begingroup \c@pgf@countd=\tikz@lib@dv@exp \advance\c@pgf@countd by1 \edef\tikz@lib@dv@exp{\the\c@pgf@countd}% \pgfmath@smuggleone\tikz@lib@dv@exp \endgroup \divide\pgf@xc by 10\relax \pgfmathfloatcreate{\tikz@lib@dv@flags}{\pgf@sys@tonumber{\pgf@xc}}{\tikz@lib@dv@exp}% \fi \pgfmathfloattofixed{\pgfmathresult}% \let\tikz@lib@dv@step=\pgfmathresult }% % % Logarithmic axes % \tikzset{ /tikz/data visualization/axis options/.cd, exponential steps/.style={tick placement strategy=\tikz@lib@dv@compute@at@log}, % % Basic setters % logarithmic/.style={ \tikz@dv@axis/function=\pgfdvmathln{\pgfvalue}{\pgfvalue}, \tikz@dv@axis/scaling/default=1 at 0 and 10 at 1, exponential steps } }% \def\tikz@lib@dv@compute@at@log{% % Setup about: \let\tikz@lib@dv@compute@about=\tikz@lib@dv@about@log% \let\tikz@lib@dv@step\relax% \pgfkeysvalueof{/tikz/data visualization/compute step} \ifx\tikz@lib@dv@step\relax% \else% % Gather interesting values \tikz@lib@dv@mapper.get in range interval()% \pgfdvinrangeinterval.get min and max()% \pgfdvmathlog{\pgfdvminlog}{\pgfdvmin}% \pgfdvmathlog{\pgfdvmaxlog}{\pgfdvmax}% \pgfkeysgetvalue{/tikz/data visualization/phase}\tikz@temp \pgfdvmathenter{\tikz@dv@lib@phase}{\tikz@temp} \pgfdvmathenter{\tikz@dv@lib@step}{\tikz@lib@dv@step} % Compute start: \pgfdvmathsub{\tikz@dv@lib@temp}{\pgfdvminlog}{\tikz@dv@lib@phase}% temp = dvmin - phase \pgfdvmathdiv{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% temp = temp/step \pgfdvmathfloor{\tikz@dv@lib@temp}{\tikz@dv@lib@temp}% temp = floor(temp) \pgfdvmathmul{\tikz@lib@dv@current}{\tikz@dv@lib@temp}{\tikz@dv@lib@step}% current = temp*step ... \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@phase}% + phase \let\tikz@lib@dv@ats\pgfutil@empty% \let\tikz@lib@dv@minor@ats\pgfutil@empty% \pgfdvmathenter{\tikz@one@hundreth}{0.001}% \pgfdvmathsub{\tikz@lib@temp}{\pgfdvmaxlog}{\pgfdvminlog}% \pgfdvmathmul{\tikz@lib@dv@epsilon}{\tikz@lib@temp}{\tikz@one@hundreth}% epsilon = (max - min)/100 \pgfdvmathsub{\tikz@lib@dv@min@minus@epsilon}{\pgfdvminlog}{\tikz@lib@dv@epsilon}% \pgfdvmathadd{\tikz@lib@dv@max@plus@epsilon}{\pgfdvmaxlog}{\tikz@lib@dv@epsilon}% \pgfkeysgetvalue{/tikz/data visualization/minor steps between steps}\tikz@lib@dv@substeps% \ifx\tikz@lib@dv@substeps\pgfutil@empty \else \pgfmathsetmacro\tikz@temp{\tikz@lib@dv@substeps+1}% \pgfdvmathenter{\tikz@dv@lib@substeps}{\tikz@temp}% \fi \loop% \ifx\tikz@lib@dv@substeps\pgfutil@empty% \else% \let\tikz@lib@dv@subcurrent=\tikz@lib@dv@current% \pgfdvmathadd{\tikz@lib@dv@subcurrent@next}{\tikz@lib@dv@subcurrent}{\tikz@dv@lib@step}% \pgfdvmathpowten{\tikz@lib@dv@subcurrent}{\tikz@lib@dv@subcurrent}% \pgfdvmathpowten{\tikz@lib@dv@subcurrent@max}{\tikz@lib@dv@subcurrent@next}% \pgfdvmathsub{\tikz@lib@dv@subcurrent@diff}{\tikz@lib@dv@subcurrent@max}{\tikz@lib@dv@subcurrent}% \pgfdvmathdiv{\tikz@lib@dv@substep}{\tikz@lib@dv@subcurrent@diff}{\tikz@dv@lib@substeps}% \pgfmathsetcount{\c@pgf@counta}{\tikz@lib@dv@substeps}% \let\tikz@lib@dv@next=\tikz@lib@dv@subloop% \tikz@lib@dv@subloop \fi% \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@min@minus@epsilon}{}{% \pgfdvmathpowten{\tikz@lib@dv@current@pow}{\tikz@lib@dv@current}% \pgfdvmathexitbyserializing{\tikz@temp}{\tikz@lib@dv@current@pow}% \edef\tikz@lib@dv@ats{\tikz@lib@dv@ats,\tikz@temp}% } \pgfdvmathadd{\tikz@lib@dv@current}{\tikz@lib@dv@current}{\tikz@dv@lib@step}% \pgfdvmathifless{\tikz@lib@dv@current}{\tikz@lib@dv@max@plus@epsilon}{\tikz@lib@dv@continuetrue}{\tikz@lib@dv@continuefalse}% \iftikz@lib@dv@continue% \repeat% \tikzdatavisualizationset{major/.expanded={at={\tikz@lib@dv@ats}},minor/.expanded={at={\tikz@lib@dv@minor@ats}}}% \fi% }% \newif\iftikz@lib@dv@continue \def\tikz@lib@dv@about@log#1{% \tikz@lib@dv@mapper.get in range interval()% \pgfdvinrangeinterval.get min and max()% \pgfdvmathlog{\pgfdvmin}{\pgfdvmin}% \pgfdvmathlog{\pgfdvmax}{\pgfdvmax}% \pgfdvmathsub{\tikz@lib@dv@diff}{\pgfdvmax}{\pgfdvmin} \pgfdvmathenter{\tikz@lib@dv@about@val}{#1}% \pgfdvmathdiv{\tikz@lib@dv@around}{\tikz@lib@dv@diff}{\tikz@lib@dv@about@val}% % Make mantisse sensible \pgfmathfloattomacro{\tikz@lib@dv@around}{\tikz@lib@dv@flags}{\tikz@lib@dv@mant}{\tikz@lib@dv@exp} \ifdim\tikz@lib@dv@exp pt<0pt% \pgfmathfloatcreate{1}{1.0}{0}% \else \pgf@xc=\tikz@lib@dv@mant pt\relax% \ifdim\pgf@xc<2.5pt \pgfmathfloatcreate{1}{1.0}{\tikz@lib@dv@exp} \else\ifdim\pgf@xc<5.1pt \pgfmathfloatcreate{1}{3.0}{\tikz@lib@dv@exp} \else \pgfmathfloatcreate{1}{6.0}{\tikz@lib@dv@exp} \fi\fi \fi% \pgfmathfloattofixed{\pgfmathresult} \let\tikz@lib@dv@step=\pgfmathresult }% % % Cartesian axes % \tikzdatavisualizationset{% new Cartesian axis/.style={ new axis base={#1}, new object={ class=linear transformer, store=/tikz/data visualization/#1/linear transformer, arg1/.expanded=\pgfkeysvalueof{/tikz/data visualization/#1/attribute}/scaled, arg2 from key=/tikz/data visualization/#1/unit vector, }, #1/scaling/default/.initial=0 at 0 and 1 at 1cm, #1/unit vector/.initial=\pgfqpoint{1pt}{0pt}, } }% \tikzset{ /tikz/data visualization/axis options/.cd, unit vector/.code=\tikz@scan@one@point\tikz@lib@dv@uv#1, length/.style={\tikz@dv@axis/scaling=min at 0 and max at #1}, unit length/.code={\tikz@dv@parse@unit@length{#1}}, power unit length/.style={\tikz@dv@axis/scaling=1 at 0 and 10 at #1} }% \def\tikz@lib@dv@uv#1{% \pgfkeyssetvalue{\tikz@dv@axis/unit vector}{#1} }% \def\tikz@dv@parse@unit@length#1{ \pgfutil@in@{per}{#1} \ifpgfutil@in@% \tikz@dv@parse@unit@length@#1\pgf@stop% \else% \tikz@dv@parse@unit@length@#1per1units\pgf@stop% \fi% }% \def\tikz@dv@parse@unit@length@#1per#2units\pgf@stop{ \pgfkeysalso{\tikz@dv@axis/scaling=0 at 0 and #2 at #1} }% % % Common visualizer interface % \tikzdatavisualizationset{ new visualizer/.style n args={3}{ #1/.code={ \def\tikz@visualizer{#1}% \pgfkeys{/tikz/data visualization/visualizer options/.cd,##1} \pgf@dv@do@adddata{\pgfkeysvalueof{/pgf/data visualization/obj}.add data(\pgfkeys{/data point/set=#1})}% }, /utils/exec={ \advance\tikzdvvisualizercounter by 1\relax \edef\tikz@temp{/data point/set/#1/.initial=\the\tikzdvvisualizercounter} \expandafter\tikzset\expandafter{\tikz@temp} }, /data point/#1/execute at begin/.initial={ \pgfkeyssetvalue{/data point/set}{#1} \scope[ #2, /tikz/data visualization/every visualizer/.try, /tikz/data visualization/visualizers/#1/signal, /tikz/data visualization/visualizers/#1/styling/.try] }, /data point/#1/execute at end/.initial={ \path; % invokes every path implicitly \endscope }, /tikz/data visualization/visualizers/#1/signal/.code=\pgf@signalstyle.emit(), /tikz/data visualization/visualizers/#1/styling/.style=, /tikz/data visualization/visualizers/#1/label in legend options/.style={#3}, }, style sheet/.style={/data point/set/.style sheet={#1}}, /pgf/data/set/.style={/data point/set=#1}, }% \tikzdatavisualizationset{ new sub visualizer/.style n args={4}{ #4/#1/.code={ \def\tikz@visualizer{#4/#1}% \pgfkeys{/tikz/data visualization/visualizer options/.cd,##1} }, /data point/#4/#1/execute at begin/.initial={ \pgfkeyssetvalue{/data point/set}{#4} \scope[ #2, /tikz/data visualization/every visualizer/.try, /tikz/data visualization/visualizers/#4/signal, /tikz/data visualization/visualizers/#4/styling/.try, /tikz/data visualization/visualizers/#4/#1/styling/.try] }, /data point/#4/#1/execute at end/.initial={ \path; % invokes every path implicitly \endscope }, /tikz/data visualization/visualizers/#4/#1/styling/.style=, /tikz/data visualization/visualizers/#4/#1/label in legend options/.style={#3}, } }% \def\tikz@do@visualizer#1#2{% \tikzdatavisualizationset{ #2=#1 } }% \newcount\tikzdvvisualizercounter \newif\iftikz@dv@visualizer@label@inline \tikzdatavisualizationset{visualizer options/.cd, @set/.style 2 args={ /tikz/data visualization/visualizers/\tikz@visualizer/styling/.append style={/utils/exec={\let\tikz@dv@plot@handler=#1}}, /tikz/data visualization/visualizers/\tikz@visualizer/label in legend options/.append style={#2} }, no lines/.style={@set={\pgfplothandlerdiscard}{default label in legend mark}}, smooth line/.style={@set={\pgfplothandlercurveto}{default label in legend path}}, smooth cycle/.style={@set={\pgfplothandlerclosedcurve}{default label in legend closed path}}, straight line/.style={@set={\pgfplothandlerlineto}{default label in legend path}}, straight cycle/.style={@set={\pgfplothandlerpolygon}{default label in legend closed path}}, polygon/.style={straight cycle},% alias gap line/.style={@set={\pgfplothandlergaplineto}{default label in legend path}}, gap cycle/.style={@set={\pgfplothandlergapcycle}{gap circular label in legend line}} }% % % Label visualizer % \tikzdatavisualizationset{ new label visualizer/.style 2 args={ new object={ when=before visualization, class=label visualizer, before creation={ \begingroup \def\tikz@visualizer{#1}% \pgfkeys{/tikz/data visualization/visualizer label options/.cd, #2} \pgfkeysgetvalue{/tikz/data visualization/visualizer label options/text}\tikz@dv@temp@lab \def\tikz@tempa{ \scope[ /utils/exec=\def\tikz@visualizer{#1},% /tikz/data visualization/visualizer label options/.cd, #2] \tikzdatavisualizationset{every data set label/.try} \path [ /data point/set=#1,/utils/exec=\pgf@signalstyle.emit(), /tikz/data visualization/.cd,every label in data/.try] (label visualizer coordinate') -- (label visualizer coordinate) node [ auto, at end, /tikz/data visualization/node styling] } \expandafter\def\expandafter\tikz@tempb\expandafter{\expandafter{\tikz@dv@temp@lab};}% \expandafter\expandafter\expandafter\gdef% \expandafter\expandafter\expandafter\tikz@dv@label@code% \expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter\relax% \expandafter\expandafter\expandafter{\expandafter\tikz@tempa\tikz@tempb\endscope}} \global\let\tikz@dv@label@attribute=\tikz@dv@label@attribute \global\let\tikz@dv@label@threshold=\tikz@dv@label@threshold \endgroup }, arg1/.expand once=\tikz@dv@label@attribute, arg2=\tikz@dv@label@threshold, arg3/.expand once=\tikz@dv@label@code, arg4=\pgfdvvisualizerfilter{#1} }, /utils/exec=\tikz@create@label@count{#1} }, % Label style text colored/.style={node style={text=visualizer color}} }% \def\tikz@create@label@count#1{ \tikzdatavisualizationset{ new object={ when=before survey, store=/tikz/data visualization/visualizers/#1/count/obj, class=count, arg1=set/#1/count, after creation={\tikzdvobj.set filter(\pgfdvvisualizerfilter{#1})} } } }% \pgfkeys{ /tikz/data visualization/visualizer label options/.cd, when/.code args={#1 is#2}{% \def\tikz@dv@label@attribute{#1}% \def\tikz@dv@label@threshold{#2}% }, index/.code={% \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}% \def\tikz@dv@label@threshold{#1}% }, pos/.code={% \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}% \pgfkeysvalueof{/tikz/data visualization/visualizers/\tikz@visualizer/count/obj}.get max(\tikz@lib@max) \edef\tikz@dv@label@threshold{(#1*\tikz@lib@max)}% }, auto/.code={% \edef\tikz@dv@label@attribute{set/\tikz@visualizer/count}% \pgfkeysvalueof{/tikz/data visualization/visualizers/\tikz@visualizer/count/obj}.get max(\tikz@lib@max) \edef\tikz@dv@label@threshold{({(\pgfkeysvalueof{/data point/set/\tikz@visualizer}-0.5)/\the\tikzdvvisualizercounter*\tikz@lib@max})} }, text/.initial=, text'/.style={text={#1},node style=swap,/utils/exec=\def\tikz@lib@dv@pin@sign{-}}, node style/.style={/tikz/data visualization/node style={#1}}, text colored/.style=/tikz/data visualization/text colored, pin angle/.store in=\tikz@lib@dv@pin@dir, pin length/.style={node style={pin distance={#1}}}, }% \let\tikz@lib@dv@pin@sign\pgfutil@empty \let\tikz@dv@label@attribute\pgfutil@empty \let\tikz@dv@label@threshold\pgfutil@empty \let\tikz@dv@label@code\pgfutil@empty % % Legend handling % \tikzdatavisualizationset{ new legend/.code={ \pgfkeysifdefined{/tikz/data visualization/#1/at}{} {\tikzdatavisualizationset{ new object={ class=legend, store=/tikz/data visualization/#1/obj, arg1 from key=/tikz/data visualization/#1/@columns or rows, arg2 from key=/tikz/data visualization/#1/@ideal, arg3 from key=/tikz/data visualization/#1/max entries, arg4 from key=/tikz/data visualization/#1/@strategy, after creation={ \tikzdatavisualizationset{ legend actions/.append={ \pgfkeysgetvalue{/tikz/data visualization/#1/obj}\pgf@dv@legend% { \pgf@dv@legend.get arrangement(\pgf@dv@temp)% \pgfkeysgetvalue{/tikz/data visualization/#1/at}\pgf@dv@at% \pgfkeysgetvalue{/tikz/data visualization/#1/anchor}\pgf@dv@anchor% \let\pgfdvnextcell=\pgfmatrixnextcell% \let\pgfdvendrow=\pgfmatrixendrow% \def\pgf@marshal{ \matrix[at/.expand once=\pgf@dv@at,matrix anchor/.expand once=\pgf@dv@anchor,/tikz/data visualization/#1/matrix node styling] } \expandafter\pgf@marshal\expandafter{\pgf@dv@temp}; } } } } }, #1/@columns or rows/.initial=columns, #1/@ideal/.initial=1, #1/max entries/.initial=100, #1/@strategy/.initial=down then right, #1/anchor/.initial=west, #1/at/.initial=(data visualization bounding box.east), #1/matrix node styling/.style={row sep=0pt,column sep=.8em}, % % % #1/.code={ \let\tikz@temp\tikz@dv@legend% \def\tikz@dv@legend{/tikz/data visualization/#1}% \expandafter\tikz@do@legend@options\expandafter{\tikz@temp}{##1}% }, #1={every new legend} }}}, new legend/.default=main legend, legend/.style={ new legend, main legend={#1} } }% \def\tikz@do@legend@options#1#2{ \pgfkeys{/tikz/data visualization/legend options/.cd,#2} \def\tikz@dv@legend{#1} }% \let\tikz@dv@legend\pgfutil@empty \tikzset{ /tikz/data visualization/legend options/.cd, % % How to arrange the entries in the legend % ideal number of columns/.style={\tikz@dv@legend/@columns or rows=columns,\tikz@dv@legend/@ideal={#1}}, ideal number of rows/.style={\tikz@dv@legend/@columns or rows=rows,\tikz@dv@legend/@ideal={#1}}, columns/.style={ideal number of columns={#1}},% alias rows/.style={ideal number of rows={#1}},% alias max rows/.style={\tikz@dv@legend/@columns or rows=columns,\tikz@dv@legend/max entries={#1}}, max columns/.style={\tikz@dv@legend/@columns or rows=rows,\tikz@dv@legend/max entries={#1}}, down then right/.style={\tikz@dv@legend/@strategy=down then right}, down then left/.style={\tikz@dv@legend/@strategy=down then left}, up then right/.style={\tikz@dv@legend/@strategy=up then right}, up then left/.style={\tikz@dv@legend/@strategy=up then left}, right then down/.style={\tikz@dv@legend/@strategy=right then down}, left then down/.style={\tikz@dv@legend/@strategy=left then down}, right then up/.style={\tikz@dv@legend/@strategy=right then up}, left then up/.style={\tikz@dv@legend/@strategy=left then up}, % % Where to put the legend % anchor/.style={\tikz@dv@legend/anchor={#1}}, at/.style={\tikz@dv@legend/at={#1}}, % Outer placements right/.style={east outside}, left/.style={west outside}, above/.style={north outside}, below/.style={south outside}, east outside/.style={ columns=1, at={([xshift=.8em]data visualization bounding box.east)}, anchor=west, }, north east outside/.style={ columns=1, at={([xshift=.8em]data visualization bounding box.north east|- data bounding box.north)}, anchor=north west, }, south east outside/.style={ columns=1, at={([xshift=.8em]data visualization bounding box.south east |- data bounding box.south)}, anchor=south west, }, west outside/.style={ columns=1, label style=text left, at={([xshift=-.8em]data visualization bounding box.west)}, anchor=east, }, north west outside/.style={ columns=1, label style=text left, at={([xshift=-.8em]data visualization bounding box.north west |- data bounding box.north)}, anchor=north east, }, south west outside/.style={ columns=1, label style=text left, at={([xshift=-.8em]data visualization bounding box.south west |- data bounding box.south)}, anchor=south east, }, south outside/.style={ rows=1, at={([yshift=-.5em]data visualization bounding box.south)}, anchor=north, }, north outside/.style={ rows=1, at={([yshift=.5em]data visualization bounding box.north)}, anchor=south, }, every new legend/.style={east outside,label style=text right}, % % Inner placements % % First, styling every legend inside/.style={ opaque=white, label style={node style={font=\pgfutil@font@footnotesize}} }, opaque/.style={ matrix node style={ inner sep=.333ex, outer sep=.5ex, rounded corners=3pt, execute at begin cell={\tikzset{sharp corners}}, % get rid of % rounded corners in cells of the % legend matrix fill=#1 }, }, opaque/.default=white, transparent/.style={matrix node style={fill=none}}, % Second, the placements north east inside/.style={ columns=1, at={([xshift=-.3em]data bounding box.north east)}, anchor=north east, every legend inside }, south west inside/.style={ columns=1, at={([xshift=.3em]data bounding box.south west)}, anchor=south west, every legend inside }, north west inside/.style={ columns=1, at={([xshift=.3em]data bounding box.north west)}, anchor=north west, every legend inside }, south east inside/.style={ columns=1, at={([xshift=-.3em]data bounding box.south east)}, anchor=south east, every legend inside }, west inside/.style={ columns=1, at={([xshift=.3em]data bounding box.west)}, anchor=west, every legend inside }, east inside/.style={ columns=1, at={([xshift=.3em]data bounding box.east)}, anchor=east, every legend inside }, north inside/.style={ rows=1, at={(data bounding box.north)}, anchor=north, every legend inside }, south inside/.style={ rows=1, at={(data bounding box.south)}, anchor=south, every legend inside }, % Additional inner placements at values/.style={ at={(visualization cs:#1)}, anchor=center, every legend inside }, right of/.style={ at={(visualization cs:#1)}, anchor=west, every legend inside }, left of/.style={ at={(visualization cs:#1)}, anchor=east, every legend inside }, above of/.style={ at={(visualization cs:#1)}, anchor=south, every legend inside }, below of/.style={ at={(visualization cs:#1)}, anchor=north, every legend inside }, above right of/.style={ at={(visualization cs:#1)}, anchor=south west, every legend inside }, above left of/.style={ at={(visualization cs:#1)}, anchor=south east, every legend inside }, below right of/.style={ at={(visualization cs:#1)}, anchor=north west, every legend inside }, below left of/.style={ at={(visualization cs:#1)}, anchor=north east, every legend inside }, % % % % Label text styling % label style/.style={ matrix node style={/tikz/data visualization/every label in legend/.append style={#1}} }, % % Styling % matrix node style/.style={\tikz@dv@legend/matrix node styling/.append style={#1}}, }% \tikzdatavisualizationset{ new legend entry/.code={ \begingroup \pgfkeys{/tikz/data visualization/legend entry options/.cd,#1} \pgfkeysgetvalue{/tikz/data visualization/legend entry options/legend}\tikz@dv@temp@legend \global\let\tikz@dv@temp@legend\tikz@dv@temp@legend \endgroup \tikzdatavisualizationset{new legend/.expanded=\tikz@dv@temp@legend}% \expandafter\tikz@dv@add@legend@entry\expandafter{\tikz@dv@temp@legend}{#1} } }% \def\tikz@dv@add@legend@entry#1#2{ \tikz@main@dv.at start survey({ \pgfkeysgetvalue{/tikz/data visualization/#1/obj}\pgf@temp \pgf@temp.add entry(\tikz@dv@render@legend@entry{legend=#1,#2}) }) }% \def\tikz@dv@render@legend@entry#1{ \pgfkeys{/tikz/data visualization/.cd,every data set label} \pgfkeys{/tikz/data visualization/legend entry options/.cd, /tikz/data visualization/every label in legend,#1}% \pgfkeysgetvalue{/tikz/data visualization/legend entry options/text}\tikz@dv@temp@lab \pgfkeysgetvalue{/tikz/data visualization/@node styling}\tikz@dv@temp@style \pgfkeysgetvalue{/tikz/data visualization/legend entry options/setup}\tikz@dv@temp@setup \pgfkeysgetvalue{/tikz/data visualization/legend entry options/visualizer in legend styling}\tikz@dv@temp@visual@styling \scope[/utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@setup}, /utils/exec=\pgf@signalstyle.emit()] \node[/tikz/data visualization/node styling, /utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@style}] {\tikz@dv@pre@height\tikz@dv@temp@lab\tikz@dv@post@height}; \scope[/utils/exec=\expandafter\pgfkeysalso\expandafter{\tikz@dv@temp@visual@styling}] \iftikz@lib@dv@text@only \else \pgfkeysvalueof{/tikz/data visualization/legend entry options/visualizer in legend} \fi \endscope \endscope }% \def\tikz@dv@pre@height{\hbox{\vrule height .75em width0pt}}% \def\tikz@dv@post@height{\hbox{\vrule depth .25em width0pt}}% \pgfkeys{ /tikz/data visualization/legend entry options/.cd, % % General options % text/.initial=, node style/.style={/tikz/data visualization/node style={#1}}, legend/.initial=main legend, setup/.initial=, visualizer in legend/.initial=, visualizer in legend styling/.initial=, visualizer in legend style/.style={visualizer in legend styling/.append={,#1}}, % % Legend visualizers for plots % text right/.style={ node style={anchor=mid west,inner ysep=1pt,inner xsep=0pt,reset cm,xshift=.333em}, visualizer in legend style={reset cm}, }, text left/.style={ node style={anchor=mid east,inner ysep=1pt,inner xsep=0pt,reset cm,xshift=-.333em,align=right}, visualizer in legend style={reset cm,xscale=-1}, }, text only/.style={ node style={anchor=mid west,inner ysep=1pt,inner xsep=0pt,reset cm,text=visualizer color}, /utils/exec=\tikz@lib@dv@text@onlytrue }, text colored/.style=/tikz/data visualization/text colored, }% \let\tikz@lib@dv@pin@dir\pgfutil@empty \newif\iftikz@lib@dv@text@only \pgfkeys{ /tikz/data visualization/visualizer options/.cd, label in legend/.code={\expandafter\tikz@dv@new@label@in@legend@for@visualizer\expandafter{\tikz@visualizer}{#1}}, label in data/.code=\tikzdatavisualizationset{new label visualizer/.expand once=\expandafter{\tikz@visualizer}{auto,#1}}, pin in data/.style={label in data={% node style={% /utils/exec={ \ifx\tikz@lib@dv@pin@dir\pgfutil@empty \pgf@process{\pgfpointnormalised{% \pgfpointdiff% {\pgfpointanchor{label visualizer coordinate}{center}}% {\pgfpointanchor{label visualizer coordinate'}{center}}}}% \pgf@x=-\pgf@x\relax% \edef\tikz@lib@dv@temp@rot{\noexpand\pgfqpoint{\the\pgf@y}{\the\pgf@x}}% \tikz@addtransform{\pgftransformshift{\pgfpointscale{\tikz@lib@dv@pin@sign\tikz@pin@distance}{\tikz@lib@dv@temp@rot}}} \else% \tikz@addtransform{\pgftransformshift{\pgfpointpolar{\tikz@lib@dv@pin@dir}{\tikz@lib@dv@pin@sign\tikz@pin@distance}}} \fi% }, append after command={ \bgroup [current point is local=true] (\tikzlastnode) edge [solid, every pin edge] (label visualizer coordinate) \egroup% }}, ,#1}}, style/.style={/tikz/data visualization/visualizers/\tikz@visualizer/styling/.append style={,#1}}, label in legend options/.style={/tikz/data visualization/visualizers/\tikz@visualizer/label in legend options/.append style={,#1}}, ignore style sheets/.style={/tikz/data visualization/visualizers/\tikz@visualizer/signal/.code=,/utils/exec=\advance\tikzdvvisualizercounter by -1\relax}, }% \def\tikz@dv@new@label@in@legend@for@visualizer#1#2{ \tikzdatavisualizationset{ new legend entry={ visualizer in legend style={/tikz/data visualization/visualizers/#1/styling/.try}, /tikz/data visualization/every label in legend/.try, /tikz/.cd, every label/.try, /tikz/data visualization/legend entry options/.cd, setup={/data point/set=#1}, /tikz/data visualization/visualizers/#1/label in legend options/.try, #2, } } }% \def\tikz@dv@legend@entry@as@example{ \pgfkeysgetvalue{/data point/set}{\tikz@visualizer} \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin} \tikz@dv@plot@handler \pgfplotstreamstart \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend line coordinates}{\tikz@dv@temp} \foreach \coordinate in \tikz@dv@temp { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} } \pgfplotstreamend \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end} \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin} \tikz@dv@plot@mark@maker \pgfplotstreamstart \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend mark coordinates}{\tikz@dv@temp} \foreach \coordinate in \tikz@dv@temp { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} } \pgfplotstreamend \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end} }% \tikzdatavisualizationset{ legend entry options/.cd, label in legend line coordinates/.initial=, label in legend rectangle coordinates/.initial={(-1ex,-.5ex),(-1ex,0.968ex),(0ex,0.968ex),(0ex,-.5ex)}, label in legend mark coordinates/.initial=, label in legend one mark/.style={ label in legend line coordinates={}, label in legend mark coordinates={(0,0)}, }, label in legend three marks/.style={ label in legend line coordinates={}, label in legend mark coordinates={(-3ex,-.3ex),(-1.5ex,.3ex),(0,0)}, }, straight label in legend line/.style={ label in legend line coordinates={(-2em,0),(-1.5em,0),(-.5em,0),(0,0)}, label in legend mark coordinates={(-1.5em,0),(-.5em,0)}, }, zig zag label in legend line/.style={ label in legend line coordinates={(-2em,0),(-1.5em,.3ex),(-.5em,-.3ex),(0,0)}, label in legend mark coordinates={(-1.5em,.3ex),(-.5em,-.3ex)}, }, circular label in legend line/.style={ label in legend line coordinates={% ([xshift=-1em]0:.9em and .35ex),% ([xshift=-1em]45:.9em and .35ex),% ([xshift=-1em]90:.9em and .35ex),% ([xshift=-1em]135:.9em and .35ex),% ([xshift=-1em]180:.9em and .35ex),% ([xshift=-1em]225:.9em and .35ex),% ([xshift=-1em]270:.9em and .35ex),% ([xshift=-1em]315:.9em and .35ex)},% label in legend mark coordinates={([xshift=-1em]120:.9em and .35ex),([xshift=-1em]-60:.9em and .35ex)}, }, gap circular label in legend line/.style={ label in legend line coordinates={% ([xshift=-1em,yshift=.2ex]90:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]162:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]234:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]306:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]18:1.4ex and 0.9ex)}, label in legend mark coordinates={ ([xshift=-1em,yshift=.2ex]90:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]162:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]234:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]306:1.4ex and 0.9ex),% ([xshift=-1em,yshift=.2ex]18:1.4ex and 0.9ex)} }, default label in legend path/.style={zig zag label in legend line}, default label in legend closed path/.style={circular label in legend line}, default label in legend mark/.style={label in legend one mark}, }% \def\tikz@dv@legend@entry@visualizer@visualizer{ }% % % Basic visualizers % \tikzdatavisualizationset{ visualize as line/.style={ new object={ when=after survey, store=/tikz/data visualization/visualizers/#1, class=plot handler visualizer, arg1=#1, arg2={\tikz@dv@plot@handler,\tikz@dv@plot@mark@maker} }, new visualizer={#1}{% every path/.style={draw}, style={every mark/.append style={color=visualizer color}}, mark size=2pt, semithick, color=visualizer color, mark=none, /tikz/data visualization/every visualize as line/.try, }{visualizer in legend=\tikz@dv@legend@entry@as@example}, #1={straight line} }, visualize as line/.default=line, visualize as smooth line/.style={ visualize as line={#1}, #1={smooth line} }, visualize as smooth line/.default=line, visualize as smooth cycle/.style={ visualize as smooth line={#1}, #1={smooth cycle} }, visualize as smooth cycle/.default=line, visualize as scatter/.style={ new object={ when=after survey, store=/tikz/data visualization/visualizers/#1, class=plot handler visualizer, arg1=#1, arg2={\tikz@dv@plot@mark@maker} }, new visualizer={#1}{% mark=x, mark size=2pt, style={every mark/.append style={color=visualizer color}}, /tikz/data visualization/every visualize as scatter/.try, }{visualizer in legend=\tikz@dv@legend@entry@as@example}, #1={no lines} }, visualize as scatter/.default=scatter }% \def\tikz@dv@plot@mark@maker{ \let\tikz@options=\pgfutil@empty% \let\tikz@transform=\pgfutil@empty% \tikzset{solid,shift only,every mark}% \tikz@options% \ifx\tikz@plot@mark\pgfutil@empty% \pgfplothandlerdiscard \else \pgfplothandlermark{\tikz@transform\pgfuseplotmark{\tikz@plot@mark}} \fi }% % % Rectangle visualizers % \tikzdatavisualizationset{ visualize as rectangles/.style={ new object={ when=before survey, store=/tikz/data visualization/visualizers/#1, class=rectangle visualizer, arg1=#1 }, /data point/#1/attribute 1/.initial=x, /data point/#1/attribute 2/.initial=y, new visualizer={#1}{% every path/.style={draw}, semithick, color=visualizer color, /tikz/data visualization/every visualize as rectangles/.try, }{visualizer in legend=\tikz@dv@legend@entry@as@rectangle}, #1={} }, visualize as rectangles/.default=rectangles, % % % visualizer options/.cd, attribute 1/.style={/data point/\tikz@visualizer/attribute 1=#1}, attribute 2/.style={/data point/\tikz@visualizer/attribute 2=#1}, }% \def\tikz@dv@legend@entry@as@rectangle{ \pgfkeysgetvalue{/data point/set}{\tikz@visualizer} \pgfkeysvalueof{/data point/\tikz@visualizer/execute at begin} \pgfplothandlerpolygon \pgfplotstreamstart \pgfkeysgetvalue{/tikz/data visualization/legend entry options/label in legend rectangle coordinates}{\tikz@dv@temp} \foreach \coordinate in \tikz@dv@temp { \pgfplotstreampoint{\expandafter\tikz@scan@one@point\expandafter\pgfutil@firstofone\coordinate} } \pgfplotstreamend \pgfkeysvalueof{/data point/\tikz@visualizer/execute at end} }% % % Style sheets % % Style sheet handler \pgfkeysdef{/handlers/.style sheet}{% \edef\pgf@marshal{ \noexpand \pgfoonew \noexpand\tikz@dv@temp=new style attribute(\pgfkeyscurrentpath,#1) \noexpand \tikz@dv@temp.default connects() } \pgf@marshal }% \tikzset{ visualizer color/.code=\colorlet{visualizer color}{#1}, visualizer color=black }% % Default style sheets \pgfdvdeclarestylesheet{vary thickness} { default style/.style={line width={0.3pt+#1*0.2pt}} }% \pgfdvdeclarestylesheet{vary dashing} { default style/.style=solid, 1/.style=solid, 2/.style={dash pattern=on 5\pgflinewidth off 2\pgflinewidth}, 3/.style={dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth}, 4/.style={dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth}, 5/.style={dash pattern=on 10\pgflinewidth off 3\pgflinewidth}, 6/.style={dash pattern=on 10\pgflinewidth off 2\pgflinewidth on 2\pgflinewidth off 2\pgflinewidth}, 7/.style={dash pattern=on 8\pgflinewidth off 2\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth} }% \pgfdvdeclarestylesheet{vary thickness and dashing} { default style/.style=thin, 1/.style=thin, 2/.style=thick, 3/.style={ dash pattern=on 5\pgflinewidth off 2\pgflinewidth, thin }, 4/.style={ dash pattern=on 5\pgflinewidth off 2\pgflinewidth, thick, }, 5/.style={ dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth, thin }, 6/.style={ dash pattern=on 1.5\pgflinewidth off 1.5\pgflinewidth, thick }, 7/.style={ dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth, thin }, 8/.style={ dash pattern=on 5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth, thick }, 9/.style={ dash pattern=on 10\pgflinewidth off 3\pgflinewidth, thin }, 10/.style={ dash pattern=on 10\pgflinewidth off 3\pgflinewidth, thick }, 11/.style={ dash pattern=on 10\pgflinewidth off 2\pgflinewidth on 2\pgflinewidth off 2\pgflinewidth, thin }, 12/.style={ dash pattern=on 10\pgflinewidth off 2\pgflinewidth on 2\pgflinewidth off 2\pgflinewidth, thick }, 13/.style={ dash pattern=on 8\pgflinewidth off 2\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth, thin }, 14/.style={ dash pattern=on 8\pgflinewidth off 2\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth on 1.5\pgflinewidth off 1.5\pgflinewidth, thick } }% \pgfdvdeclarestylesheet{strong colors} { default style/.style={visualizer color=black}, 1/.style={visualizer color=black}, 2/.style={visualizer color=red!80!black}, 3/.style={visualizer color=blue!80!black}, 4/.style={visualizer color=green!60!black}, 5/.style={visualizer color=orange!80!black}, 6/.style={visualizer color=black!60} }% \pgfdvdeclarestylesheet{cross marks} { default style/.style={mark=x,every mark/.append style=thin,mark size=2pt}, 1/.style={mark=x,every mark/.append style=thin,mark size=2pt}, 2/.style={mark=+,every mark/.append style=thin,mark size=2pt}, 3/.style={mark=Mercedes star,every mark/.append style=thin,mark size=2pt}, 4/.style={mark=Mercedes star flipped,every mark/.append style=thin,mark size=2pt}, 5/.style={mark=star,every mark/.append style=thin,mark size=2pt}, 6/.style={mark=10-pointed star,every mark/.append style={line width=.3pt,mark size=1.8pt}} }% \pgfdvdeclarestylesheet{* mark} { default style/.style={mark=*,every mark/.append style=thin,mark size=1.4pt}, }% \pgfdvdeclarestylesheet{dot mark} { default style/.style={mark=*,every mark/.append style=thin,mark size=0.6pt}, }% \pgfdvdeclarestylesheet{o mark} { default style/.style={mark=o,every mark/.append style=thin,mark size=1.4pt}, }% % Declare a color series style sheet % % #1 = name of the style sheet % #2 = color model % #3 = initial color % #4 = step % % Description: % % This function declares a style sheet that changes colors according % to the value of the attribute. No test is made that the attribute is % a number. \def\tikzdvdeclarestylesheetcolorseries#1#2#3#4{% \definecolorseries{tikzdvcolorseries#1}{#2}{step}[#2]{#3}{#4}% \resetcolorseries{tikzdvcolorseries#1}% \pgfdvdeclarestylesheet{#1} { default style/.style={ /utils/exec=\colorlet{tikz@dv@temp}[rgb]{tikzdvcolorseries#1!![##1]}, visualizer color=tikz@dv@temp } }% }% \tikzdvdeclarestylesheetcolorseries{vary hue}{hsb}{.4,0.9,0.8}{.213,0,0}% \tikzdvdeclarestylesheetcolorseries{shades of blue}{hsb}{.65,1.4,1}{0,-.4,-.0}% \tikzdvdeclarestylesheetcolorseries{shades of red}{hsb}{0,1.4,1}{0,-.4,-.0}% \tikzdvdeclarestylesheetcolorseries{gray scale}{hsb}{0,0,-.34}{0,0,.34}% % % Basic Axes & Coordinate Systems % % % % Basic axis systems % % \tikzdatavisualizationset{ xy Cartesian/.style={ new Cartesian axis=x axis, x axis={attribute=x,unit vector={(1pt,0cm)}}, new Cartesian axis=y axis, y axis={attribute=y,unit vector={(0cm,1pt)}} }, Xy axes/.style={x axis={#1},y axis={#1}}, uv Cartesian/.style={ new Cartesian axis=u axis, u axis={attribute=u,unit vector={(1pt,0cm)}}, new Cartesian axis=v axis, v axis={attribute=v,unit vector={(0cm,1pt)}} }, uv axes/.style={u axis={#1},v axis={#1}}, }% \tikzdatavisualizationset{ xyz Cartesian cabinet/.style={ xy Cartesian, new Cartesian axis=z axis, z axis={attribute=z,unit vector={(-0.353553pt,-0.353553pt)}} }, xyz axes/.style={x axis={#1},y axis={#1},z axis={#1}}, uvw Cartesian cabinet/.style={ uv Cartesian, new Cartesian axis=w axis, w axis={attribute=w,unit vector={(-0.353553pt,-0.353553pt)}} } uvw axes/.style={u axis={#1},v axis={#1},w axis={#1}}, }% % % Create a new axis system % \tikzdatavisualizationset{ new axis system/.style n args={4}{ #1/.style={ #2, #1/.cd, #3, /tikz/data visualization/every #1/.try, ##1, /tikz/data visualization/.cd, #4, } } }% % The school book axes % % This coordinate system can be used to create plots that look like % plots in a typical school book: There are two axes called "x axis" % and "y axis" that meet at the origin, there are arrows at the ends % of the axes, pointing in the directions of the positive axes. No % scaling is done by default, rather one unit equals one 1cm. This % ensures that the even when multiple plots are created, the same % scaling will be used each time. % % To change the scaling, say "all axes={unit length=1mm}" for % instance. \tikzdatavisualizationset{ new axis system={school book axes}{% xy Cartesian, x axis={ include value=0, scaling=0 at 0 and \pgfkeysvalueof{/tikz/data visualization/school book axes/unit} at 1cm, visualize axis={y axis={goto=0},style=->,padded}, visualize ticks={common={y axis={goto=0},direction axis=y axis}, major={tick text at low, options at=0 as [{style={draw=none},no tick text}] }}, visualize grid={common={direction axis=y axis,padded}}, ticks={step=\pgfkeysvalueof{/tikz/data visualization/school book axes/unit}}, padding=0.75em }, y axis={ include value=0, scaling=0 at 0 and \pgfkeysvalueof{/tikz/data visualization/school book axes/unit} at 1cm, visualize axis={x axis={goto=0},style=->,padded}, visualize ticks={ common={x axis={goto=0},direction axis=x axis}, major={tick text at low,options at=0 as [{high=0,low=0,style={draw=none},node style={anchor=north east}}]} }, visualize grid={common={direction axis=x axis,padded}}, ticks={step=\pgfkeysvalueof{/tikz/data visualization/school book axes/unit}}, padding=0.75em } }{% standard labels }{% @make labels }, school book axes/.cd, % Possible axis positionings: % % Place labels at the ends of the axes % standard labels/.style={ /tikz/data visualization/@make labels/.style={ x axis={ visualize label={ x axis={goto=padded max, anchor at max}, y axis={goto=0} } }, y axis={ visualize label={ y axis={goto=padded max, anchor at max}, x axis={goto=0} } } } }, % % Basic unit % unit/.initial=1, }% % The scientific axes % % The scientific axes is a 2d plot that has a predetermined width and % height. The data is then scaled in such a way that it fits inside % this given rectangle. \tikzdatavisualizationset{ new axis system={scientific axes}{% xy Cartesian, every axis/.append style={style={draw=black!50}}, every ticks/.append style={style={draw=black!50}}, x axis={ length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/width}, ticks }, y axis={ length=\pgfkeysvalueof{/tikz/data visualization/scientific axes/height}, ticks } }{% standard labels, outer ticks, }{% @make axes, @make labels }, scientific axes/.cd, width/.initial=5cm, height/.initial=0.618*\pgfkeysvalueof{/tikz/data visualization/scientific axes/width},% golden ratio... outer ticks/.style={ /tikz/data visualization/@make axes/.style={ x axis={ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,high=0pt},major={tick text at low}}, visualize ticks={common={y axis={goto=padded max},direction axis=y axis,low=0pt}}, visualize axis={y axis={goto=padded min},padded}, visualize axis={y axis={goto=padded max},padded}, visualize grid={common={direction axis=y axis,padded}}, }, y axis={ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,high=0pt},major={tick text at low}}, visualize ticks={common={x axis={goto=padded max},direction axis=x axis,low=0pt}}, visualize axis={x axis={goto=padded min},padded}, visualize axis={x axis={goto=padded max},padded}, visualize grid={common={direction axis=x axis,padded}}, } } }, inner ticks/.style={ /tikz/data visualization/@make axes/.style={ x axis={ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,low=0pt},major={tick text at low}}, visualize ticks={common={y axis={goto=padded max},direction axis=y axis,high=0pt}}, visualize axis={y axis={goto=padded min},padded}, visualize axis={y axis={goto=padded max},padded}, visualize grid={common={direction axis=y axis,padded}}, }, y axis={ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,low=0pt},major={tick text at low}}, visualize ticks={common={x axis={goto=padded max},direction axis=x axis,high=0pt}}, visualize axis={x axis={goto=padded min},padded}, visualize axis={x axis={goto=padded max},padded}, visualize grid={common={direction axis=x axis,padded}}, } } }, clean/.style={ /tikz/data visualization/@make axes/.style={ x axis={ visualize ticks={common={y axis={goto=padded min},direction axis=y axis,high=0pt},major={tick text at low}}, visualize axis={y axis={goto=padded min}}, visualize axis={y axis={goto=min}, style={black!25, line cap=rect}}, visualize axis={y axis={goto=max}, style={black!25, line cap=rect}}, visualize grid={common={direction axis=y axis}}, padding=.5em, }, y axis={ visualize ticks={common={x axis={goto=padded min},direction axis=x axis,high=0pt},major={tick text at low}}, visualize axis={x axis={goto=padded min}}, visualize axis={x axis={goto=min}, style={black!25, line cap=rect}}, visualize axis={x axis={goto=max}, style={black!25, line cap=rect}}, visualize grid={common={direction axis=x axis}}, padding=.5em }, } }, % Possible axis positionings: % % Place axes labels below and left, where left label is rotated % standard labels/.style={ /tikz/data visualization/@make labels/.style={ x axis={ visualize label={ x axis={goto pos=.5}, % Vertical position comes from bounding box: node style={ at={(0,0 |- data visualization bounding box.south)}, below } } }, y axis={ visualize label={ y axis={goto pos=.5}, % Horizontal position comes from bounding box: node style={ at={(0,0 -| data visualization bounding box.west)}, rotate=90, above} } } } }, % % Place axes labels below and left, no rotation % upright labels/.style={ /tikz/data visualization/@make labels/.style={ x axis={ visualize label={ x axis={goto pos=.5}, % Vertical position comes from bounding box: node style={ at={(0,0 |- data visualization bounding box.south)}, below } } }, y axis={ visualize label={ y axis={goto pos=.5}, % Horizontal position comes from bounding box: node style={ at={(0,0 -| data visualization bounding box.west)}, left } } } } }, % % Place axes at the ends of the axes % end labels/.style={ /tikz/data visualization/@make labels/.style={ x axis={ visualize label={ y axis={goto=padded min}, % Vertical position comes from bounding box: node style={ at={(0,0 -| data visualization bounding box.east)}, right } } }, y axis={ visualize label={ x axis={goto=padded min}, % Horizontal position comes from bounding box: node style={ at={(0,0 |- data visualization bounding box.north)}, above } } } } } }% \endinput