For this to work correctly, you need to manually keep two axes in sync (you can use a callback). Also note that this approach cannot be used with aspect=1 & adjustable=bbox.
Another way is to use axes_grid1 toolkit. Here is the modified version of your script w/ axes_grid1. Regards, -JJ import numpy as np import matplotlib import matplotlib.colorbar as cb import matplotlib.pyplot as plt y = np.reshape(np.arange(0, 1000000, 1), (20000, 50)) test = 'hot' f1 = plt.figure(1) f1.patch.set_facecolor('#c0c0c0') import mpl_toolkits.axes_grid1 as axes_grid1 # use axes_grid1.host_axes ax1 = axes_grid1.host_axes([0.09, 0.15, 0.82, 0.80]) axc = f1.add_axes([0.09, 0.05, 0.82, 0.05]) im1 = ax1.imshow(y, cmap=test, aspect='auto', origin='lower') cb.Colorbar(axc, im1, orientation='horizontal') # use twin() not twinx() ax2 = ax1.twin() # make ticklabels on the top invisible ax2.axis["top"].toggle(ticklabels=False) fmtr = matplotlib.ticker.FuncFormatter(lambda x,pos: "%.2f"% (x*2,)) ax2.yaxis.set_major_formatter(fmtr) plt.show() On Sat, Mar 12, 2011 at 9:01 AM, Thomas Brezinski <thom...@arlut.utexas.edu> wrote: > Jason Stone, on 2011-02-18 14:39, wrote: >> Good afternoon all, >> One last matplotlib question for the group for today. On one of my GUI >> plots, I'm calling imshow on an array of data (to display it in the same >> way >> MATLAB's imagesc command does). I'd like to add a second y-axis to the >> right side of the plot that is completely dependent on the values on the >> primary y-axis. Essentially, for each y-axis tick point, I'll put the >> y-axis 'value' into a formula and then put the result on the second >> y-axis. >> I did this in MATLAB by essentially overlaying a second set of axes over >> the plot, but I haven't found the exact way to do it with matplotlib yet. >> I've seen a few examples online, but they all use the second overlaid >> plot >> to actually plot new data - I wouldn't be doing this. >> Would I need to use the twinx (or twiny) function? >> Are there examples of this on the web that I haven't found that somebody >> could point me towards? > > Hi Jason, > > here's an example that does what you want, using e^x as the > formula, change the paramter to fmtr to suit your needs: > > ax = plt.subplot(1,1,1) > ax.plot(np.sin(np.linspace(0,np.pi))) > ax2 = ax.twinx() > ax2._sharey = ax # share both x and y > fmtr = mpl.ticker.FuncFormatter(lambda x,pos: "%.2f"%np.exp(x)) > ax2.yaxis.set_major_formatter(fmtr) > plt.draw() > > best, > -- > Paul Ivanov > 314 address only used for lists, off-list direct email at: > http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7 > > > Paul, > I am currently doing something very similar and was hoping I could ask for a > little clarification. I want to have two y axes where the ticks are in the > same locations and the 2nd y-axis labels are just twice the 1st y-axis > labels. When I implement your example, I don't quite understand how to > ensure the ticks are at the same locations. Also, when the data changes to a > new image, the 1st y-axis updates but the 2nd y-axis does not. Is there a > convenient way to force both to update each time, or does the figure need to > be cleared and essentially built from scratch each time. > > for example, with the following code: > > import numpy as np > import matplotlib > import matplotlib.colorbar as cb > import matplotlib.pyplot as plt > > y = np.reshape(np.arange(0, 1000000, 1), (20000, 50)) > test = 'hot' > f1 = plt.figure(1) > f1.patch.set_facecolor('#c0c0c0') > ax1 = f1.add_axes([0.09, 0.15, 0.82, 0.80]) > axc = f1.add_axes([0.09, 0.05, 0.82, 0.05]) > im1 = ax1.imshow(y, cmap=test, aspect='auto', origin='lower') > cb.Colorbar(axc, im1, orientation='horizontal') > ax2 = ax1.twinx() > ax2._sharey = ax1 # share both x and y > fmtr = matplotlib.ticker.FuncFormatter(lambda x,pos: "%.2f"%np.exp(x)) > ax2.yaxis.set_major_formatter(fmtr) > plt.show() > > The ticks on the right are obviously at different locations compared to the > left ticks. Also, if imshow was to be called a new array of data, the ticks > on the right would remain the same. So is there an easy way to force the > locations to be the same, and is there an easy way force the right y-axis to > update each time? Thank you very much for your time and help. > > -Thomas > > > > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.10 (GNU/Linux) > > iEYEARECAAYFAk1kEfIACgkQe+cmRQ8+KPe0vACfSMtFJ9KSRwqU34j6QevaSZqD > qM0An2WHMyKisrwDIyKaCcuygrsWvZbX > =OIU1 > -----END PGP SIGNATURE----- > > ------------------------------------------------------------------------------ > Free Software Download: Index, Search & Analyze Logs and other IT data in > Real-Time with Splunk. Collect, index and harness all the fast moving IT > data > generated by your applications, servers and devices whether physical, > virtual > or in the cloud. Deliver compliance at lower cost and gain new business > insights. http://p.sf.net/sfu/splunk-dev2dev > _______________________________________________ > Matplotlib-users mailing list > Matplotlib-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > > ------------------------------------------------------------------------------ > Colocation vs. Managed Hosting > A question and answer guide to determining the best fit > for your organization - today and in the future. > http://p.sf.net/sfu/internap-sfd2d > _______________________________________________ > Matplotlib-users mailing list > Matplotlib-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users