1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
\subsection{Units in Labels}
\label{sec:units}
{\noindent {\emph{by Nick Papior Andersen}}}
\begin{pgfplotslibrary}{units}
A library which allows to use automatic typesetting of units in labels. The library utilizes different keys to typeset the final output in a consistent way.
Calling one of the commands automatically sets the key `|use units=true|' so one does not have to worry about this.
\end{pgfplotslibrary}
\PGFPlots\ has the capability of supporting units. This provides quick customization of the plot as well as the addition of units in labels.
Loading the library automatically enables the typesetting of units in labels. Currently it only supports predefined SI units but a per-user customization is also
implemented such that it can be used in any way you like.
First the key which enables you to switch on/off the unit system.
\begin{pgfplotskey}{use units=\marg{boolean} (initially true)}
This key simply enables \PGFPlots\ to use what is described next. This key will be set to true if you load the library. You can use this to temporarily
determine whether the unit library should be used in plots.
\end{pgfplotskey}
\begin{pgfplotsxykey}{\x\ unit=\marg{unit} (initially empty)}
These keys set the unit in their respective axis. In SI units you could for instance set the |x unit| in Newton as |x unit=N|.
\end{pgfplotsxykey}
\begin{pgfplotsxykey}{\x\ unit prefix=\marg{prefix} (initially empty)}
These keys set the prefix of the unit. If a value on the |y axis| is in kilo you would set the |y unit prefix=k|. Prefix will be typeset in front of the unit.
This command will not intervene with the basis of the axis system. I.e. a prefix as just mentioned will not divide every |y axis| number by 1000.
In order to do this, see key \meta{axis}| SI prefix|, see Section \ref{sec:SI:prefix}.
Notice that if the \meta{axis}| unit| isn't set the entire unit will not be typeset.
\paragraph{Remarks:} Remember that all typesetting of labels occur within math mode (i.e.\ within \$\$ delimiters). Therefore one can use \textbackslash|frac|
and other mathematics commands.
\end{pgfplotsxykey}
Often one just has to utilize the above mentioned keys. It is the basis of the unit typesetting system provided by \PGFPlots.
% \usepgfplotslibrary{units}
\begin{codeexample}[]
\begin{tikzpicture}
\begin{axis}[use units,
x unit=m,x unit prefix=k,
y unit=N,y unit prefix=m,
xlabel=Distance,ylabel=Force]
\addplot coordinates {
(1,2.3)
(2,2.7)
(3,2.1)
(4,1.8)
(5,1.5)
(6,1.1)
};
\end{axis}
\end{tikzpicture}
\end{codeexample}
Below is an example of what would be obtained according to the styles
\begin{codeexample}[code only]
% x label becomes ``Temperature [T]'', y label becomes ``Nothing''
\pgfplotsset{use units,x unit=T,xlabel=Temperature,ylabel=Nothing}
% x label becomes ``Temperature'', y label becomes ``Nothing''
\pgfplotsset{use units,x unit prefix=m,xlabel=Temperature,ylabel=Nothing}
\end{codeexample}
Notice the second example. Only setting the prefix will not activate the unit typesetting. Therefore one should ensure to use the |x unit| key if the
typesetting of the labels should be done.
For typesetting the units one can also change the appearance. For instance one might not like the square brackets which surround the unit. These can
luckily be changed using the below keys.
\begin{pgfplotskeylist}{unit marking pre=\marg{pre} (initially \textbackslash left[),unit marking post=\marg{post} (initially \textbackslash right]),unit markings=\mchoice{parenthesis,square brackets,slash space} (initially square brackets)}
These keys set the surroundings of the unit. The initial yields $\left[\frac{1}{2}\right]$ such that you can typeset fractions in units. Be aware that
you can only obtain large fractions if you use \textbackslash|dfrac|. These can easily be set using the option key |unit markings| where the options typesets as the following
\begin{codeexample}[code only]
\pgfplotsset{x unit=T,unit markings=parenthesis} % x unit becomes `` \left(T\right)''
\pgfplotsset{x unit=T,unit markings=square brackets} % x unit becomes `` \left[T\right]''
\pgfplotsset{x unit=T,unit markings=slash space} % x unit becomes `` / T''
\end{codeexample}
Notice that all typesetting of units first inserts a space and then the |unit marking pre| code.
Of course you can just manually set each of them with the |unit marking pre| and |unit marking post| keys. Just remember that they are typeset within a \$\$.
\end{pgfplotskeylist}
One will typically typeset the unit with a specific font. To do so an option of changing the typesetting command is supplied.
\begin{pgfplotscodetwokey}{unit code}%\textbackslash mathrm\{\})}
This can be utilized to great extent. By default, units are typeset as |\mathrm{|\meta{unit prefix}\meta{unit}|}|. But if one for instance
wishes to utilize the package |siunitx|, which has great capabilities in typesetting both units, numbers and angles, one can just set the key as
\begin{codeexample}[code only]
\pgfplotsset{unit code/.code 2 args={\si{#1#2}}}
\end{codeexample}
which would yield the unit as |\si{|\meta{unit prefix}\meta{unit}|}|.
The first argument is typeset as \meta{unit prefix} and the second argument is \meta{unit}.
The most important thing is that the command needs exactly two arguments. So if you would like a command that typesets the prefix in bold face and the
unit in normal roman font you should call
\begin{codeexample}[code only]
\pgfplotsset{unit code/.code 2 args={\mathbf{#1}\mathrm{#2}}
\end{codeexample}
\end{pgfplotscodetwokey}
\subsubsection{Preset SI prefixes}
\label{sec:SI:prefix}
\index{prefixes!unit}
To support the SI system a number of preset keys are defined. This should yield a more intuitive way of supplying the prefix as well as add some more
functionality. For instance it provides an easy scaling mechanism.
\begin{pgfplotsxykeylist}{\x\ SI prefix=\mchoice{yocto,\dots,milli,centi,deci,deca,hecto,kilo,\dots,yotta} (initially none),
change \x\ base=\mchoice{true,false} (initially false)}
These keys sets the prefix of the unit. The allowed prefixes are:
\begin{center}
\begin{tabular}{>{\ttfamily}c>{$}c<{$}}
\toprule
\rm Prefix & $Power$\\
\midrule
yocto & -24\\
zepto & -21\\
atto & -18\\
femto & -15\\
pico & -12\\
nano& -9\\
micro & -6\\
milli & -3\\
centi& -2\\
deci& -1\\
\bottomrule
\end{tabular}\qquad\qquad
\begin{tabular}{>{\ttfamily}cc}
\toprule
\rm Prefix & Power\\
\midrule
deca & 1\\
hecto & 2\\
kilo & 3\\
mega & 6\\
giga & 9\\
tera& 12\\
peta & 15\\
exa & 18\\
zetta& 21\\
yotta& 24\\
\bottomrule
\end{tabular}
\end{center}
As well as resetting the base of the axis if the key |change |\meta{axis}| base=true|. Just \textbf{remember} to
set the |change |\meta{axis}| base| before using the \meta{axis}| SI prefix| key.
See the utilization as in the example below.
% \usepgfplotslibrary{units}
\begin{codeexample}[]
\begin{tikzpicture}
\begin{axis}[change x base,
x SI prefix=kilo,x unit=m,
y SI prefix=milli,y unit=N,
xlabel=Distance,ylabel=Force]
\addplot coordinates {
(1000,1)
(2000,1.1)
(3000,1.2)
(4000,1.3)
};
\end{axis}
\end{tikzpicture}
\end{codeexample}
Notice that the |x axis| has changed base without displaying the $\cdot 10^{3}$. This is done by using the key |change x base|. Even though you have used
the key |y SI prefix=milli| the base isn't changed on the |y axis|. Try adding |change y base| just after |change x base| and see the result!
\end{pgfplotsxykeylist}
The above keys are the easy implementation of the base change. Below is a further customization of the base change. It makes it easy to implement a prefix
with a custom base change.
\begin{pgfplotskey}{axis base prefix={axis \marg{axis} base \marg{base} prefix \marg{prefix}} (initially empty)}
One can utilize this key to customize further of the base and setting the prefix.
\begin{codeexample}[code only]
\pgfplotsset{change x base,axis base prefix={axis x base -3 prefix k}}
\pgfplotsset{change x base,x SI prefix=kilo}
\end{codeexample}
The above two commands are thus equivalent. Remember that the base should operate in opposite of prefix!
\end{pgfplotskey}
|