0

I have used following code to plot graph using matplotlib with 4 parameter X=depth, y1=temp, y2=salinity, y3=velocity but value of velocity is not display properly and 2nd and 3rd axes are not adjustable(scale value) as 1st when zoom that has constant scale value, how could i make it adjustable(scale value) ,I mean scale value will be variable for all axes when zoom in zoomout.

 from mpl_toolkits.axes_grid1 import host_subplot
 import mpl_toolkits.axisartist as AA
 import matplotlib.pyplot as plt
 import numpy as np

 if 1:

    host = host_subplot(111, axes_class=AA.Axes)
    plt.subplots_adjust(right=0.75)

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

    offset = 60
    new_fixed_axis = par2.get_grid_helper().new_fixed_axis
    par2.axis["right"] = new_fixed_axis(loc="right", axes=par2, offset=  
    (offset, 0))

    par2.axis["right"].toggle(all=True)

   # host.set_xlim(0, 2)
    #host.set_ylim(0, 2)

    host.set_xlabel("Depth")
    host.set_ylabel("Temperature")
    par1.set_ylabel("Salinity")
    par2.set_ylabel("Velocity")
    x  = np.array([0,5,10,15,20,25,30,35])
    y1 = np.array([30.340,30.080,29.116,28.395,28.093,28.040,27.975,27.872])
    y2 = np.array([33.130,34.046,35.119,34.933,34.764,34.824,34.860,34.852])
    y3 = np.array([1544.296, 1544.787, 1543.452,1542.280,1541.522,1544.548,1541.523,1541.368])

    p1, = host.plot(x, y1, label="Temperature")
    p2, = par1.plot(x, y2, label="Salinity")
    p3, = par2.plot(x, y3, label="Velocity")

    #par1.set_ylim(0, 4)
    #par2.set_ylim(1, 65)

    host.legend()

    host.axis["left"].label.set_color(p1.get_color())
    par1.axis["right"].label.set_color(p2.get_color())
    par2.axis["right"].label.set_color(p3.get_color())

    plt.draw()
    plt.show()
3
  • If you create "host" using plt.subplot instead of host_subplot, then they should all pan+zoom together as you describe. Do you need to use host_subplot in order to get the nice offset-y-scale that you are using? Commented Sep 30, 2015 at 14:37
  • it is not working please edit this code with change Commented Oct 1, 2015 at 10:04
  • I fixed the indentation issue, so the code should easily run now. Commented Oct 1, 2015 at 13:50

1 Answer 1

1

Here is an example that works that way that you suggest: http://matplotlib.org/examples/pylab_examples/multiple_yaxis_with_spines.html

Basically, they avoid using the "new_fixed_axis" function:

from mpl_toolkits.axes_grid1 import host_subplot
import mpl_toolkits.axisartist as AA
import matplotlib.pyplot as plt
import numpy as np

fig,host = plt.subplots()
fig.subplots_adjust(right=0.75)

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

par2.spines["right"].set_position(("axes", 1.2))
par2.spines["right"].set_visible(True)

host.set_xlabel("Depth")
host.set_ylabel("Temperature")
par1.set_ylabel("Salinity")
par2.set_ylabel("Velocity")

x  = np.array([0,5,10,15,20,25,30,35])
y1 = np.array([30.340,30.080,29.116,28.395,28.093,28.040,27.975,27.872])
y2 = np.array([33.130,34.046,35.119,34.933,34.764,34.824,34.860,34.852])
y3 = np.array([1544.296, 1544.787, 1543.452,1542.280,1541.522,1544.548,1541.523,1541.368])

p1, = host.plot(x, y1, 'b', label="Temperature")
p2, = par1.plot(x, y2, 'r', label="Salinity")
p3, = par2.plot(x, y3/10, 'g', label="Velocity/00")

host.yaxis.label.set_color(p1.get_color())
par1.yaxis.label.set_color(p2.get_color())
par2.yaxis.label.set_color(p3.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)
host.tick_params(axis='x', **tkw)

host.legend()
plt.show()

There is still a little problem with the weird y-axis scales, but at least they zoom+pan together :).

enter image description here

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the solution and by providing the limit of range of y axis using ylim problem with the weird y-axis scales will be solved.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.