%-------------------------------------------- % % Package pgfplots % % Provides a user-friendly interface to create function plots (normal % plots, semi-logplots and double-logplots). % % It is based on Till Tantau's PGF package. % % Copyright 2007-2012 by Christian Feuersänger. % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % %-------------------------------------------- \edef\pgfplots@oldcatcodesemicolon{\the\catcode`\;}% \catcode`\;=12 \input pgfplotscore.code.tex \input pgfplotslibrary.code.tex \input pgfplotsoldpgfsupp_loader.code.tex \input pgfplotsutil.code.tex \input pgfplotscolormap.code.tex \input pgfplotsstackedplots.code.tex \input pgfplotsplothandlers.code.tex \input pgfplots.scaling.code.tex \input pgfplotscoordprocessing.code.tex \input pgfplotsticks.code.tex \input pgfplots.paths.code.tex \usetikzlibrary{decorations,decorations.pathmorphing,decorations.pathreplacing} % FIXME: reduce number of variables! \newif\ifpgfplots@bb@isactive \newif\ifpgfplots@xislinear \newif\ifpgfplots@has@label@information \newif\ifpgfplots@yislinear \newif\ifpgfplots@zislinear \newif\ifpgfplots@reverse@legend \newif\ifpgfplots@transpose@legend \newif\ifpgfplots@allow@reversal@of@rel@axis@cs \newif\ifpgfplots@scanline@verbose \newif\ifpgfplots@plot@graphics@autoadjustaxis \newif\ifpgfplots@scaleuniformly@warning \newcount\pgfplots@numplots \newdimen\pgfplots@xmin@reg \newdimen\pgfplots@xmax@reg \newdimen\pgfplots@ymin@reg \newdimen\pgfplots@ymax@reg \newdimen\pgfplots@zmin@reg \newdimen\pgfplots@zmax@reg \newif\ifpgfplots@warn@for@filter@discards \newif\ifpgfplots@isuniformtick \newif\ifpgfplotsplothandlermesh@patch@type@sampling \newif\ifpgfplots@clip@limits \newif\ifpgfplots@clip \newif\ifpgfplots@plot@coords@mathparser \pgfplots@plot@coords@mathparsertrue \newif\ifpgfplots@enlargelimits \newif\ifpgfplots@enlargelimits@respect@figure@size \pgfplots@enlargelimits@respect@figure@sizetrue \newif\ifpgfplots@enlargelimits@rel@thresh \newif\ifpgfplots@enlargelimits@auto \newif\ifpgfplots@tickshow \newif\ifpgfplots@scatterplotenabled \newif\ifpgfplots@xminorticks \newif\ifpgfplots@xmajorticks \newif\ifpgfplots@yminorticks \newif\ifpgfplots@ymajorticks \newif\ifpgfplots@zminorticks \newif\ifpgfplots@zmajorticks \newif\ifpgfplots@xminorgrids \newif\ifpgfplots@xmajorgrids \newif\ifpgfplots@yminorgrids \newif\ifpgfplots@ymajorgrids \newif\ifpgfplots@zminorgrids \newif\ifpgfplots@zmajorgrids \newif\ifpgfplots@clip@marker@paths \newif\ifpgfplots@axis@on@top \newif\ifpgfplots@separate@axis@lines \newif\ifpgfplots@identify@log@minor@tick@pos \newif\ifpgfplots@disablelogfilter@x \newif\ifpgfplots@disablelogfilter@y \newif\ifpgfplots@disablelogfilter@z \newif\ifpgfplots@disabledatascaling \newif\ifpgfplots@hide@x \newif\ifpgfplots@hide@y \newif\ifpgfplots@hide@z \newif\ifpgfplots@shownothingof@x \newif\ifpgfplots@shownothingof@y \newif\ifpgfplots@shownothingof@z \newif\ifpgfplots@is@old@list@format \newif\ifpgfplots@errorbars@enabled \newif\ifpgfplots@scale@only@axis \newif\ifpgfplots@xticklabel@interval \newif\ifpgfplots@yticklabel@interval \newif\ifpgfplots@zticklabel@interval \newif\ifpgfplots@stackedmode \newif\ifpgfplots@stacked@reverse \newif\ifpgfplots@stacked@plus \newif\ifpgfplots@plot@file@skipfirst \newif\ifpgfplots@threedim \newif\ifpgfplots@curplot@threedim \newif\ifpgfplotsthreedim \newif\ifpgfplots@curplot@isirrelevant \newif\ifpgfplots@colorbar \newif\ifpgfplots@deprecated@anchors \newif\ifpgfplots@translategnuplot \pgfplots@translategnuplottrue \let\pgfnodepartimagebox=\pgfnodeparttextbox \newif\ifpgfplotsplothandlermesh@internaldepth \newif\ifpgfplotsplothandlermesh@hide@refined@edges \newif\ifpgfplots@has@cell@picture \newif\ifpgfplots@collect@firstplot@astick \newif\ifpgfplots@units@use \def\pgfplots@errorbars@xdirection{0}% pre-init, see below \def\pgfplots@errorbars@ydirection{0}% \def\pgfplots@errorbars@zdirection{0}% \def\axisdefaultwidth{240pt} \def\axisdefaultheight{207pt} \def\pgfplotsifaxisthreedim#1#2{\ifpgfplots@threedim #1\else #2\fi}% \def\pgfplotsifcurplotthreedim#1#2{\ifpgfplots@curplot@threedim #1\else #2\fi}% % Invokes '#2' if a cycle list named '#1' exists and '#3' if not. \long\def\pgfplotsifcyclelistexists#1#2#3{% \pgfutil@IfUndefined{pgfp@cyclist@\string#1@}{#3}{#2}% }% % Creates a named plot cycle list. % % #1: the name of the final list. Can be used in 'cycle list name' % #2: the list entries. You can use either a comma-separated list or % a '\\'-terminated list. The latter case also requires '\\' % AFTER the last entry. \def\pgfplotscreateplotcyclelist#1#2{\expandafter\pgfplots@assign@list\csname pgfp@cyclist@\string#1@\endcsname{#2}} \pgfplotscreateplotcyclelist{black white}{% every mark/.append style={fill=gray},mark=*\\% every mark/.append style={fill=gray},mark=square*\\% every mark/.append style={fill=gray},mark=otimes*\\% mark=star\\% every mark/.append style={fill=gray},mark=diamond*\\% densely dashed,every mark/.append style={solid,fill=gray},mark=*\\% densely dashed,every mark/.append style={solid,fill=gray},mark=square*\\% densely dashed,every mark/.append style={solid,fill=gray},mark=otimes*\\% densely dashed,every mark/.append style={solid},mark=star\\% densely dashed,every mark/.append style={solid,fill=gray},mark=diamond*\\% } \pgfplotscreateplotcyclelist{color}{% blue,every mark/.append style={fill=blue!80!black},mark=*\\% red,every mark/.append style={fill=red!80!black},mark=square*\\% brown!60!black,every mark/.append style={fill=brown!80!black},mark=otimes*\\% black,mark=star\\% blue,every mark/.append style={fill=blue!80!black},mark=diamond*\\% red,densely dashed,every mark/.append style={solid,fill=red!80!black},mark=*\\% brown!60!black,densely dashed,every mark/.append style={solid,fill=brown!80!black},mark=square*\\% black,densely dashed,every mark/.append style={solid,fill=gray},mark=otimes*\\% blue,densely dashed,mark=star,every mark/.append style=solid\\% red,densely dashed,every mark/.append style={solid,fill=red!80!black},mark=diamond*\\% } \pgfplotscreateplotcyclelist{linestyles}{solid,dashed,dotted} \pgfplotscreateplotcyclelist{linestyles*}{solid,dashed,dotted,dashdotted,dashdotdotted} \pgfplotscreateplotcyclelist{color list}{red,blue,black,yellow,brown,teal,orange,violet,cyan,green!70!black,magenta,gray} \pgfplotscreateplotcyclelist{mark list}{% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=square*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=triangle*\\% every mark/.append style={solid},mark=star\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=diamond*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill!40},mark=otimes*\\% every mark/.append style={solid},mark=|\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=pentagon*\\% every mark/.append style={solid},mark=text,text mark=p\\% every mark/.append style={solid},mark=text,text mark=a\\% } \pgfplotscreateplotcyclelist{mark list*}{% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=square*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=triangle*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=pentagon*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfcircle*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill,rotate=180},mark=halfdiamond*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill!40},mark=otimes*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=diamond*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare right*\\% every mark/.append style={solid,fill=\pgfplots@mark@list@fill},mark=halfsquare left*\\% } \def\pgfplots@mark@list@fill{\pgfkeysvalueof{/pgfplots/mark list fill}} \pgfplotscreateplotcyclelist{exotic}{% teal,every mark/.append style={fill=teal!80!black},mark=*\\% orange,every mark/.append style={fill=orange!80!black},mark=square*\\% cyan!60!black,every mark/.append style={fill=cyan!80!black},mark=otimes*\\% red!70!white,mark=star\\% lime!80!black,every mark/.append style={fill=lime},mark=diamond*\\% red,densely dashed,every mark/.append style={solid,fill=red!80!black},mark=*\\% yellow!60!black,densely dashed,every mark/.append style={solid,fill=yellow!80!black},mark=square*\\% black,every mark/.append style={solid,fill=gray},mark=otimes*\\% blue,densely dashed,mark=star,every mark/.append style=solid\\% red,densely dashed,every mark/.append style={solid,fill=red!80!black},mark=diamond*\\% } % backwards compatibility: \let\pgfcreateplotcyclelist=\pgfplotscreateplotcyclelist \pgfplots@letcsname{pgfp@cyclist@\string\blackwhiteplotspeclist @}={pgfp@cyclist@black white@}% \pgfplots@letcsname{pgfp@cyclist@\string\coloredplotspeclist @}={pgfp@cyclist@color@}% %%%% \def\pgfplotsdeprecatedstylecheck#1{% \pgfkeysifdefined{#1/.@cmd}{% \begingroup \edef\pgfkeyscurrentkey{#1}% \pgfkeyssplitpath \pgfplots@warning{Loading deprecated style option \pgfkeyscurrentpath/\pgfkeyscurrentname. Please replace '\string\tikzstyle{\pgfkeyscurrentname}' with '\string\pgfplotsset{\pgfkeyscurrentname/.style={}}' (or '\string\pgfplotsset{\pgfkeyscurrentname/.append style={}}').}% \endgroup \pgfkeysvalueof{#1/.@cmd}\pgfeov }{}% }% \def\pgfplots@scaled@ticks@setargs#1#2{% \pgfutil@in@{:}{#2}% \ifpgfutil@in@ \pgfplots@scaled@ticks@setargs@{#1}#2\pgfplots@EOI \else \expandafter\pgfutil@in@\expandafter{\pgfplots@activecolon}{#2}% \ifpgfutil@in@ \pgfplots@scaled@ticks@setargs@active{#1}#2\pgfplots@EOI \else \pgfkeysalso{/pgfplots/scaled #1 ticks/#2}% \fi \fi }% \def\pgfplots@scaled@ticks@setargs@#1#2:#3\pgfplots@EOI{% \pgfkeysalso{/pgfplots/scaled #1 ticks/#2=#3}% } { \catcode`\:=\active \gdef\pgfplots@scaled@ticks@setargs@active#1#2:#3\pgfplots@EOI{% \pgfkeysalso{/pgfplots/scaled #1 ticks/#2=#3}% } } \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@center\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@south west\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@south\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@south east\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@east\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@north east\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@north\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@north west\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@west\endcsname{1} \expandafter\def\csname pgfplots@nodesnearcoordsalign@isanchor@baseline\endcsname{1} % Sets the keys for /pgfplots/[xyz]ticklabel anchor. % #1: one of [xyz] % #2: the value \def\pgfplots@setticklabel@anchor@for#1#2{% \def\pgfplots@loc@TMPa{#2}% \def\pgfplots@loc@TMPb{auto}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@ticklabel@anchor@#1\endcsname{0}% \else \def\pgfplots@loc@TMPb{near ticklabel}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@ticklabel@anchor@#1\endcsname{1}% \else \def\pgfplots@loc@TMPb{tikz}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@ticklabel@anchor@#1\endcsname{2}% \else \pgfplots@error{Sorry, I got an unexpected value for '#1ticklabel anchor': '#2'. Expected one of 'auto', 'near ticklabel' or 'tikz'.}% \fi \fi \fi }% % Does the work for '[xyz]ticklabel pos'. % % #1: the axis (x,y or z). % #2: the key argument. Accepts % 'lower', % 'upper', % 'default' -> depends on 'tick pos' % 'left' = 'lower', % 'bottom' = 'lower', % 'right' = 'upper' % 'top' = 'upper'. % \def\pgfplots@setkey@ticklabelpos#1#2{% \def\pgfplots@loc@TMPa{#2}% \def\pgfplots@loc@TMPb{lower}% \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{l}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \else \def\pgfplots@loc@TMPb{upper}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{u}% \else \def\pgfplots@loc@TMPb{default}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{}% \else \def\pgfplots@loc@TMPb{left}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \else \def\pgfplots@loc@TMPb{right}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{u}% \else \expandafter\def\csname pgfplots@#1ticklabel@pos\endcsname{}% \pgfplots@error{Sorry, the key '#1ticklabel pos' does not know what to do with '#2'... accepted values are 'default, 'lower', 'upper' and some aliases. Maybe you misspelled it?}% \fi \fi \fi \fi \fi }% % Sets 'x dir={normal,reverse}' % #1: an axis % #2: the key's value to apply \def\pgfplots@setkey@axisdir@for#1#2{% \def\pgfplots@loc@TMPa{#2}% \def\pgfplots@loc@TMPb{normal}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \pgfkeyssetvalue{/pgfplots/#1 dir/value}{n}% \else \def\pgfplots@loc@TMPb{reverse}% \ifx\pgfplots@loc@TMPa\pgfplots@loc@TMPb \pgfkeyssetvalue{/pgfplots/#1 dir/value}{r}% \else \pgfkeyssetvalue{/pgfplots/#1 dir/value}{n}% \pgfplots@error{Sorry, the key '#1 dir' does not know what to do with '#2'... accepted values are 'normal' or 'reverse'.}% \fi \fi }% \def\pgfplots@meshmode{n}% none \def\pgfplotsplothandlermesh@flatmode{m}% mean \def\pgfplots@cycle@multi@list@EOI{\pgfplots@cycle@multi@list@EOI}% \def\pgfplots@cycle@multi@list#1{% \def\pgfplots@loc@TMPb{0}% \gdef\pgfplots@cycle@multi@list@finalize@{}% \pgfplots@cycle@multi@list@#1\nextlist\pgfplots@cycle@multi@list@EOI }% \def\pgfplots@cycle@multi@list@#1\nextlist{% \def\pgfplots@loc@TMPa{#1}% \ifx\pgfplots@loc@TMPa\pgfutil@empty % ignore it if someone provided too many \nextlist commands. \else % parse and store list: \begingroup \def\pgfplots@as@string{#1}% this deals with control sequences inside of #1. \pgfplots@command@to@string\pgfplots@as@string\pgfplots@as@string \expandafter\pgfplots@cycle@multi@list@findnamed\pgfplots@as@string\pgfplots@EOI \global\let\pgfplots@glob@TMPa=\pgfplots@loc@TMPa \endgroup \ifx\pgfplots@glob@TMPa\pgfutil@empty % create it: \pgfplotscreateplotcyclelist{/pgfplots/cycle multi list/@list\pgfplots@loc@TMPb}{#1}% \else % ok, take an existing one \expandafter\let\csname pgfp@cyclist@/pgfplots/cycle multi list/@list\pgfplots@loc@TMPb @\endcsname=\pgfplots@glob@TMPa \fi \begingroup \expandafter\pgfplotslistsize\csname pgfp@cyclist@/pgfplots/cycle multi list/@list\pgfplots@loc@TMPb @\endcsname\to\c@pgf@counta \edef\pgfmathresult{\the\c@pgf@counta}% \pgfmath@smuggleone\pgfmathresult \endgroup \pgfkeyslet{/pgfplots/cycle multi list/@totalN\pgfplots@loc@TMPb}\pgfmathresult \pgfkeyslet{/pgfplots/cycle multi list/@N\pgfplots@loc@TMPb}\pgfmathresult %\def\temp{#1}\message{cycle multi list/@list={\meaning\temp}; /@N\pgfplots@loc@TMPb = \pgfkeysvalueof{/pgfplots/cycle multi list/@N\pgfplots@loc@TMPb}.}% \pgfplotsutil@advancestringcounter\pgfplots@loc@TMPb \fi % \pgfutil@ifnextchar{\pgfplots@cycle@multi@list@EOI}{% \pgfplots@cycle@multi@list@finalize }{% \pgfplots@cycle@multi@list@ }% }% % checks for % - % - [ of] % POSTCONDITION: % 1. pgfplots@loc@TMPa will be \pgfutil@empty if there is no such % list. % 2. \pgfplots@loc@TMPa will be \let to the list if there is one. % 3. \pgfplots@cycle@multi@list@finalize@ will contain any 'partial sublist' % commands. \def\pgfplots@cycle@multi@list@findnamed{\pgfutil@ifnextchar[{\pgfplots@cycle@multi@list@findnamed@}{\pgfplots@cycle@multi@list@findnamed@[]}}% \def\pgfplots@cycle@multi@list@findnamed@[#1]#2\pgfplots@EOI{% \def\pgfplots@loc@TMPa{#1}% \ifx\pgfplots@loc@TMPa\pgfutil@empty \else \pgfplots@cycle@multi@list@findnamed@@#1 \pgfplots@EOI \fi \pgfplotsifcyclelistexists{#2}{% \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfp@cyclist@\string#2@\endcsname% }{% \let\pgfplots@loc@TMPa=\pgfutil@empty }% } \def\pgfplots@cycle@multi@list@findnamed@@#1 {\pgfutil@ifnextchar o{\pgfplots@cycle@multi@list@findnamed@@@{#1}}{\pgfplots@cycle@multi@list@findnamed@@@{#1}of}}% \def\pgfplots@cycle@multi@list@findnamed@@@#1of#2\pgfplots@EOI{% \begingroup \t@pgfplots@toka=\expandafter{\pgfplots@cycle@multi@list@finalize@}% \t@pgfplots@tokb={#1}% \xdef\pgfplots@cycle@multi@list@finalize@{\the\t@pgfplots@toka \noexpand\pgfkeys{/pgfplots/cycle multi list/partial sublist={\pgfplots@loc@TMPb}{\the\t@pgfplots@tokb}}% }% \endgroup } \def\pgfplots@cycle@multi@list@finalize\pgfplots@cycle@multi@list@EOI{% \pgfkeyslet{/pgfplots/cycle multi list/@dim}\pgfplots@loc@TMPb \pgfplots@cycle@multi@list@finalize@ }% \def\pgfplots@pgfkeys@set@point@meta@value#1{% % \pgfutil@in@{=}{#1}% \ifpgfutil@in@ \def\pgfplots@loc@TMPa##1=##2\pgfplots@EOI{% % remove spaces from ##1 and ##2: \pgfkeys@spdef\pgfplots@loc@TMPa{##1}% \pgfkeys@spdef\pgfplots@loc@TMPb{##2}% % % check if the argument is known: \pgfkeysifdefined{/pgfplots/point meta/\pgfplots@loc@TMPa/.@cmd}{% \def\pgfplots@loc@TMPc{% \pgfplots@invoke@pgfkeyscode{/pgfplots/point meta/\pgfplots@loc@TMPa/.@cmd}% }% \expandafter\pgfplots@loc@TMPc\expandafter{\pgfplots@loc@TMPb}% }{% \pgfplotsthrow{invalid argument} {\pgfplots@loc@TMPa}% {Sorry, `##1' is no valid choice for `point meta'. Maybe you misspelled it?}% \pgfeov }% }% % disassemble key'='value: \pgfplots@loc@TMPa#1\pgfplots@EOI \else % the following code allows % 'point meta=\thisrow{xcol}' even though % \thisrow might be undefined in the context where keys are set. % I convert the argument to a string. \def\pgfplots@loc@TMPa{#1}% \pgfplots@command@to@string\pgfplots@loc@TMPa\pgfplots@loc@TMPb % \pgfkeysifdefined{/pgfplots/point meta/\pgfplots@loc@TMPb/.@cmd}{% % ok, use it! \pgfplots@invoke@pgfkeyscode{/pgfplots/point meta/\pgfplots@loc@TMPb/.@cmd}{}% }{% % oh, then it will be a math expression. \pgfplots@invoke@pgfkeyscode{/pgfplots/point meta/expr/.@cmd}{#1}% }% \fi % % }% \newif\ifpgfplotsplothandlermesh@shownormals \pgfkeys{% % /.define layer set={}{