[Matplotlib-users] Third Y axis is like cryptonite to pyplot.

Thomas Caswell tcaswell at gmail.com
Fri Jun 26 19:20:43 EDT 2020

```Andre,

Please subscribe to the mailing list
https://mail.python.org/mailman/listinfo/matplotlib-users to post
un-moderated and to make sure you get responses.

Thank you for a copy-paste-runable example, it made it super easy to help
you :)

The units that the positions are in is "axes fraction" which is the
coordinate system on the Axes object where (0,0) is the lower left and (1,
1) is the upper right.  In this coordinate system 1.35 is a 0.35 * (axes
width) to the right of the right edge of the Axes which happens to be out
of the Figure.

If do

it will shrink the Axes enough that it will all fit.

If you have a mpl >=3.1 then you can do

fig, host = plt.subplots(constrained_layout=True)

It will automatically resize everything to fit and completely fill the
available space!

Tom

------

import matplotlib.pyplot as plt

def make_patch_spines_invisible(ax):
ax.set_frame_on(True)
ax.patch.set_visible(False)
for sp in ax.spines.values():
sp.set_visible(False)

fig, host = plt.subplots(constrained_layout=True)

par1 = host.twinx()
par2 = host.twinx()
par3 = host.twinx()

# Offset the right spine of par2.  The ticks and label have already been
# placed on the right by twinx above.
par2.spines["right"].set_position(("axes", 1.2))
par3.spines["right"].set_position(("axes", 1.35))
# Having been created by twinx, par2 has its frame off, so the line of its
# detached spine is invisible.  First, activate the frame but make the patch
# and spines invisible.
#make_patch_spines_invisible(par2)
make_patch_spines_invisible(par3)
# Second, show the right spine.
par2.spines["right"].set_visible(True)
par3.spines["right"].set_visible(True)

p1, = host.plot([0, 1, 2], [0, 1, 2], "b-", label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], "r-", label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], "g-", label="Velocity")
p4, = par3.plot([0, 1, 2], [12, 18, 20], "y-", label="Voltage")

host.set_xlim(0, 2)
host.set_ylim(0, 2)
par1.set_ylim(0, 4)
par2.set_ylim(1, 65)

host.set_xlabel("Distance")
host.set_ylabel("Density")
par1.set_ylabel("Temperature")
par2.set_ylabel("Velocity")
par3.set_ylabel("Voltage")

host.yaxis.label.set_color(p1.get_color())
par1.yaxis.label.set_color(p2.get_color())
par2.yaxis.label.set_color(p3.get_color())
par3.yaxis.label.set_color(p4.get_color())

tkw = dict(size=4, width=1.5)
host.tick_params(axis='y', colors=p1.get_color(), **tkw)
par1.tick_params(axis='y', colors=p2.get_color(), **tkw)
par2.tick_params(axis='y', colors=p3.get_color(), **tkw)
par3.tick_params(axis='y', colors=p4.get_color(), **tkw)
host.tick_params(axis='x', **tkw)

lines = [p1, p2, p3 , p4]

host.legend(lines, [l.get_label() for l in lines])

plt.show()

On Fri, Jun 26, 2020 at 6:45 PM Andre <andre.kjellstrup at gmail.com> wrote:

> I modified
>
> https://matplotlib.org/3.2.1/gallery/ticks_and_spines/multiple_yaxis_with_spines.html
> to have a fourth data-set:
> https://gist.github.com/AndKe/c0c999a22a8daebafb62171b671bf131
>
> With the offset of "1.35"
> par3.spines["right"].set_position(("axes", 1.35))
> One can get a glimpse of that, any less, and it will overlap, and more it
> will be invisible.
>
> changing "right" to "left" does nothing.
> Also, the resulting spines placement does vary with the width of the
> window.
> - wasting more space the wider the window gets.
>
>
>
> --
> Sent from:
> http://matplotlib.1069221.n5.nabble.com/matplotlib-users-f3.html
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org
> https://mail.python.org/mailman/listinfo/matplotlib-users
>

--
Thomas Caswell
tcaswell at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20200626/54b09901/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fig1.png
Type: image/png
Size: 62755 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/matplotlib-users/attachments/20200626/54b09901/attachment-0001.png>
```