I want to label the axes in a 3D plot with pgfplots. Using the anchors .right of origin and .above origin, I can label the axes as "x" and "y" in 2D with ease. In 3D, the labels must be tweaked to appear in the correct place, and I have no simple way of labeling the x-axis. Is there an anchor that directly relates to these positions? The MWE below shows what I've produced so far.

[width=175pt,tick label style={font=\scriptsize},axis on top,
axis lines=center,
y dir=reverse,
zmin=-1.1, zmax=1.1
\node [right] at (myplot.right of origin)[shift={(-20pt,-8pt)}] {\scriptsize $y$};
\node [above] at (myplot.above origin) [shift={(0,-20pt)}] {\scriptsize $z$};

enter image description here

  • Why don’t you use the options xlabel, ylabel and zlabel? Although they are bugged in the current version (Axis label placement in 3d plot far out but why?), this should be much better. To avoid updating you can use the axis cs coordinate system as in pgfplots: labels and width issues in non-boxed 3d plot with oblique projection. Not related to your question, but you might be interested in the enlargelimits option. Feb 28, 2013 at 18:37
  • I didn't know the xlabel, etc., options existed (and I do read the manuals... apparently just not very well). I do get the bugs you alluded to; I'll see if the workarounds provided there help or will wait for a stable pgfplots update.
    – GregH
    Feb 28, 2013 at 18:52

1 Answer 1


With pgfplots, version 1.8, and


it is possible to use the options

  • xlabel,
  • ylabel as well as
  • zlabel.

As you have reversed the direction of the y axis with

y dir=reverse

it is necessary to correct the position of every axis y label with

every axis y label/.append style={at=(ticklabel* cs:0)}

(previously (ticklabel* cs:1)).

In the example below, I have resized the whole plot so that it isn’t as cramped as before.


  tick label style={font=\scriptsize},
  axis on top,
  axis lines=center,
  y dir=reverse,
  ymin=-1, ymax=1, xmin=-1, xmax=1, zmin=-1, zmax=1,
  xlabel=$x$, ylabel=$y$, zlabel=$z$,
  every axis y label/.append style={at=(ticklabel* cs:0)}]


enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.