Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Rightclick on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
From: JaeJoon Lee <lee.joon@gm...>  20091028 23:45:43
Attachments:
spine_multiy_test.py

On Wed, Oct 28, 2009 at 7:20 PM, Phillip M. Feldman <pfeldman@...> wrote: > If I get one yaxis with the 'host', and each invocation of twinx adds > another yaxis, then it seems that I must invoke twinx three times to get > four yaxes. Does twinx add more than one yaxis per invocation? (The > documentation that I've been able to find is ambiguous about this). twinx add a single axes. In your original code, you were calling twinx 4times. See if the attached code works. While I acknowledge that using spines with multiple yaxis is a bit tricky, I don't think the situation will change anytime soon. Regards, JJ 
From: Dr. Phillip M. Feldman <pfeldman@ve...>  20091028 03:12:44

Starting with code written by JaeJoon Lee, I constructed a template program for creating plots with multiple yaxes. The program mostly works, but there are two odd glitches: (1) Not only is the yaxis for dependent variable #1 blue (as it should be), but the entire frame around the plot is blue. (2) The yaxis for dependent variable #2 has two sets of tick labels. The set in black contains the correct values in the correct positions, but has the wrong color. The other set of tick labels has the correct color (dark red), but the values and locations are wrong. (In fact, these are same values and positions as for dependent variable #1). http://www.nabble.com/file/p26088693/multiple_yaxes_with_spines.png http://www.nabble.com/file/p26088693/multiple_yaxes_with_spines.py multiple_yaxes_with_spines.py Any suggestions as to how I can fix these two problems will be greatly appreciated. P.S. I'm creating this program for use by students in the Engineering Academy at Dos Pueblos High School, partly because they need something like this for the projects that they are working on, and partly because I would like to have them get some exposure to Python and Matplotlib. P.P.S. This program has to be able to correctly generate a plot with 2, 3, or 4 yaxes, although it would be good if it can also handle the conventional case of a single yaxis. Students should be able to create plots by simply inserting their data into the code and changeing the variable label text strings.  View this message in context: http://www.nabble.com/spinesaretricky%21tp26088693p26088693.html Sent from the matplotlib  users mailing list archive at Nabble.com. 
From: JaeJoon Lee <lee.joon@gm...>  20091028 22:08:12

On Tue, Oct 27, 2009 at 11:12 PM, Dr. Phillip M. Feldman <pfeldman@...> wrote: > (1) Not only is the yaxis for dependent variable #1 blue (as it should be), > but the entire frame around the plot is blue. > at line 158, you're changing the color of all spines. Change the color of spine that you only want to change. > (2) The yaxis for dependent variable #2 has two sets of tick labels. The > set in black contains the correct values in the correct positions, but has > the wrong color. The other set of tick labels has the correct color (dark > red), but the values and locations are wrong. (In fact, these are same > values and positions as for dependent variable #1). At line 113, you're creating 4 twinx axes, instead of 3, i.e, the figure has total of 5 axes. Also, I recommend you to use the pythonic convention that list index starts from 0. Regards, JJ 
From: Phillip M. Feldman <pfeldman@ve...>  20091028 23:21:17
Attachments:
Message as HTML

# multiple_yaxes_with_spines.py # This is a template Python program for creating plots (line graphs) with 2, 3, # or 4 yaxes. (A template program is one that you can readily modify to meet # your needs). Almost all usermodifiable code is in Section 2. For most # purposes, it should not be necessary to modify anything else. # Dr. Phillip M. Feldman, 27 Oct, 2009 # Acknowledgment: This program is based on code written by JaeJoon Lee, # URL= http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/ # examples/pylab_examples/multiple_yaxis_with_spines.py?revision=7908&view=markup # Section 1: Import modules, define functions, and allocate storage. import matplotlib.pyplot as plt from numpy import * def make_patch_spines_invisible(ax): ax.set_frame_on(True) ax.patch.set_visible(False) for sp in ax.spines.itervalues(): sp.set_visible(False) def set_spine_direction(ax, direction): if direction in ["right", "left"]: ax.yaxis.set_ticks_position(direction) ax.yaxis.set_label_position(direction) elif direction in ["top", "bottom"]: ax.xaxis.set_ticks_position(direction) ax.xaxis.set_label_position(direction) else: raise ValueError("Unknown Direction: %s" % (direction,)) ax.spines[direction].set_visible(True) # Create list to store dependent variable data: y= [0, 0, 0, 0] # Section 2: Define names of variables and the data to be plotted. # `labels` stores the names of the independent and dependent variables). The # first (zeroth) item in the list is the xaxis label; remaining labels are the # first yaxis label, second yaxis label, and so on. There must be at least # two dependent variables and not more than four. labels= ['Indep. Variable', 'Dep. Variable #1', 'Dep. Variable #2', 'Dep. Variable #3', 'Dep. Variable #4'] # Plug in your data here, or code equations to generate the data if you wish to # plot mathematical functions. x stores values of the independent variable; # y[0], y[1], ... store values of the dependent variables. Each of these should # be a NumPy array. # If you are plotting mathematical functions, you will probably want an array of # uniformly spaced values of x; such an array can be created using the # `linspace` function. For example, to define x as an array of 51 values # uniformly spaced between 0 and 2, use the following command: # x= linspace(0., 2., 51) # Here is an example of 6 experimentally measured values for the first dependent # variable: # y[0]= array( [3, 2.5, 7.3e4, 4, 8, 3] ) # Note that the above statement requires both parentheses and square brackets. # With a bit of work, one could make this program read the data from a text file # or Excel worksheet. # Independent variable: x= linspace(0., 2., 51) # First dependent variable: y[0]= sqrt(x) # Second dependent variable: y[1]= 0.2 + x**0.3  0.1*x**2 y[2]= 30.*sin(1.5*x) y[3]= 30.*abs(cos(1.5*x)) # Set line colors here; each color can be specified using a singleletter color # identifier ('b'= blue, 'r'= red, 'g'= green, 'k'= black, 'y'= yellow, # 'm'= magenta, 'y'= yellow), an RGB tuple, or almost any standard English color # name written without spaces, e.g., 'darkred'. colors= ['b', 'darkred', 'g', 'magenta'] # Set the line width here. linewidth=2 is recommended. linewidth= 2 # Set the axis label size in points here. 16 is recommended. axis_label_size= 16 # Section 3: Generate the plot. N_dependents= len(labels)  1 if N_dependents > 4: raise Exception, \ 'This code currently handles a maximum of four independent variables.' # Open a new figure window, setting the size to 10by7 inches and the facecolor # to white: fig= plt.figure(figsize=(10,7), dpi=120, facecolor=[1,1,1]) host= fig.add_subplot(111) # Use twinx() to create extra axes for all dependent variables except the first # (we get the first as part of the host axes). y_axis= N_dependents * [0] y_axis[0]= host for i in range(1,len(labels)): y_axis[i1]= host.twinx() if N_dependents >= 3: # The following statement positions the third yaxis to the right of the # frame, with the space between the frame and the axis controlled by the # numerical argument to set_position; this value should be between 1.10 and # 1.2. y_axis[2].spines["right"].set_position(("axes", 1.15)) make_patch_spines_invisible(y_axis[2]) set_spine_direction(y_axis[2], "right") plt.subplots_adjust(left=0.0, right=0.8) if N_dependents >= 4: # The following statement positions the fourth yaxis to the left of the # frame, with the space between the frame and the axis controlled by the # numerical argument to set_position; this value should be between 1.10 and # 1.2. y_axis[3].spines["left"].set_position(("axes", 0.15)) make_patch_spines_invisible(y_axis[3]) set_spine_direction(y_axis[3], "left") plt.subplots_adjust(left=0.2, right=0.8) p= N_dependents * [0] # Plot the curves: for i in range(N_dependents): p[i], = y_axis[i].plot(x, y[i], colors[i], linewidth=linewidth, label=labels[i]) # Set axis limits. Use ceil() to force upper yaxis limits to be round numbers. host.set_xlim(x.min(), x.max()) # Label the xaxis: host.set_xlabel(labels[0], size=axis_label_size) for i in range(N_dependents): # Label the yaxis and set text color: y_axis[i].set_ylabel(labels[i+1], size=axis_label_size) y_axis[i].yaxis.label.set_color(colors[i]) # If you want to override the default axis limits, uncomment the following # line of code and adjust arguments appropriately: # y_axis[i].set_ylim(0.0, ceil(y[i].max())) if i== 1: y_axis[i].set_ylim(0.0, 1.5) j= 0 for sp in y_axis[i].spines.itervalues(): if j==i: sp.set_color(colors[i]) j+= 1 for obj in y_axis[i].yaxis.get_ticklines(): # `obj` is a matplotlib.lines.Line2D instance obj.set_color(colors[i]) obj.set_markeredgewidth(3) for obj in y_axis[i].yaxis.get_ticklabels(): obj.set_color(colors[i]) obj.set_size(12) obj.set_weight(600) # To enable the legend, uncomment the following two lines: # lines= p[1:] # host.legend(lines, [l.get_label() for l in lines]) plt.draw(); plt.show() 
From: JaeJoon Lee <lee.joon@gm...>  20091028 23:45:43
Attachments:
spine_multiy_test.py

On Wed, Oct 28, 2009 at 7:20 PM, Phillip M. Feldman <pfeldman@...> wrote: > If I get one yaxis with the 'host', and each invocation of twinx adds > another yaxis, then it seems that I must invoke twinx three times to get > four yaxes. Does twinx add more than one yaxis per invocation? (The > documentation that I've been able to find is ambiguous about this). twinx add a single axes. In your original code, you were calling twinx 4times. See if the attached code works. While I acknowledge that using spines with multiple yaxis is a bit tricky, I don't think the situation will change anytime soon. Regards, JJ 
From: Phillip M. Feldman <pfeldman@ve...>  20091028 23:27:50
Attachments:
Message as HTML

# multiple_yaxes_with_spines.py # This is a template Python program for creating plots (line graphs) with 2, 3, # or 4 yaxes. (A template program is one that you can readily modify to meet # your needs). Almost all usermodifiable code is in Section 2. For most # purposes, it should not be necessary to modify anything else. # Dr. Phillip M. Feldman, 27 Oct, 2009 # Acknowledgment: This program is based on code written by JaeJoon Lee, # URL= http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/ # examples/pylab_examples/multiple_yaxis_with_spines.py?revision=7908&view=markup # Section 1: Import modules, define functions, and allocate storage. import matplotlib.pyplot as plt from numpy import * def make_patch_spines_invisible(ax): ax.set_frame_on(True) ax.patch.set_visible(False) for sp in ax.spines.itervalues(): sp.set_visible(False) def set_spine_direction(ax, direction): if direction in ["right", "left"]: ax.yaxis.set_ticks_position(direction) ax.yaxis.set_label_position(direction) elif direction in ["top", "bottom"]: ax.xaxis.set_ticks_position(direction) ax.xaxis.set_label_position(direction) else: raise ValueError("Unknown Direction: %s" % (direction,)) ax.spines[direction].set_visible(True) # Create list to store dependent variable data: y= [0, 0, 0, 0] # Section 2: Define names of variables and the data to be plotted. # `labels` stores the names of the independent and dependent variables). The # first (zeroth) item in the list is the xaxis label; remaining labels are the # first yaxis label, second yaxis label, and so on. There must be at least # two dependent variables and not more than four. labels= ['Indep. Variable', 'Dep. Variable #1', 'Dep. Variable #2', 'Dep. Variable #3', 'Dep. Variable #4'] # Plug in your data here, or code equations to generate the data if you wish to # plot mathematical functions. x stores values of the independent variable; # y[0], y[1], ... store values of the dependent variables. Each of these should # be a NumPy array. # If you are plotting mathematical functions, you will probably want an array of # uniformly spaced values of x; such an array can be created using the # `linspace` function. For example, to define x as an array of 51 values # uniformly spaced between 0 and 2, use the following command: # x= linspace(0., 2., 51) # Here is an example of 6 experimentally measured values for the first dependent # variable: # y[0]= array( [3, 2.5, 7.3e4, 4, 8, 3] ) # Note that the above statement requires both parentheses and square brackets. # With a bit of work, one could make this program read the data from a text file # or Excel worksheet. # Independent variable: x= linspace(0., 2., 51) # First dependent variable: y[0]= sqrt(x) # Second dependent variable: y[1]= 0.2 + x**0.3  0.1*x**2 y[2]= 30.*sin(1.5*x) y[3]= 30.*abs(cos(1.5*x)) # Set line colors here; each color can be specified using a singleletter color # identifier ('b'= blue, 'r'= red, 'g'= green, 'k'= black, 'y'= yellow, # 'm'= magenta, 'y'= yellow), an RGB tuple, or almost any standard English color # name written without spaces, e.g., 'darkred'. colors= ['b', 'darkred', 'g', 'magenta'] # Set the line width here. linewidth=2 is recommended. linewidth= 2 # Set the axis label size in points here. 16 is recommended. axis_label_size= 16 # Section 3: Generate the plot. N_dependents= len(labels)  1 if N_dependents > 4: raise Exception, \ 'This code currently handles a maximum of four independent variables.' # Open a new figure window, setting the size to 10by7 inches and the facecolor # to white: fig= plt.figure(figsize=(10,7), dpi=120, facecolor=[1,1,1]) host= fig.add_subplot(111) # Use twinx() to create extra axes for all dependent variables except the first # (we get the first as part of the host axes). y_axis= N_dependents * [0] y_axis[0]= host for i in range(1,N_dependents): y_axis[i]= host.twinx() if N_dependents >= 3: # The following statement positions the third yaxis to the right of the # frame, with the space between the frame and the axis controlled by the # numerical argument to set_position; this value should be between 1.10 and # 1.2. y_axis[2].spines["right"].set_position(("axes", 1.15)) make_patch_spines_invisible(y_axis[2]) set_spine_direction(y_axis[2], "right") plt.subplots_adjust(left=0.0, right=0.8) if N_dependents >= 4: # The following statement positions the fourth yaxis to the left of the # frame, with the space between the frame and the axis controlled by the # numerical argument to set_position; this value should be between 1.10 and # 1.2. y_axis[3].spines["left"].set_position(("axes", 0.15)) make_patch_spines_invisible(y_axis[3]) set_spine_direction(y_axis[3], "left") plt.subplots_adjust(left=0.2, right=0.8) p= N_dependents * [0] # Plot the curves: for i in range(N_dependents): p[i], = y_axis[i].plot(x, y[i], colors[i], linewidth=linewidth, label=labels[i]) # Set axis limits. Use ceil() to force upper yaxis limits to be round numbers. host.set_xlim(x.min(), x.max()) # Label the xaxis: host.set_xlabel(labels[0], size=axis_label_size) for i in range(N_dependents): # Label the yaxis and set text color: y_axis[i].set_ylabel(labels[i+1], size=axis_label_size) y_axis[i].yaxis.label.set_color(colors[i]) # If you want to override the default axis limits, uncomment the following # line of code and adjust arguments appropriately: # y_axis[i].set_ylim(0.0, ceil(y[i].max())) if i== 1: y_axis[i].set_ylim(0.0, 1.5) j= 0 for sp in y_axis[i].spines.itervalues(): if j==i: sp.set_color(colors[i]) j+= 1 for obj in y_axis[i].yaxis.get_ticklines(): # `obj` is a matplotlib.lines.Line2D instance obj.set_color(colors[i]) obj.set_markeredgewidth(3) for obj in y_axis[i].yaxis.get_ticklabels(): obj.set_color(colors[i]) obj.set_size(12) obj.set_weight(600) # To enable the legend, uncomment the following two lines: # lines= p[1:] # host.legend(lines, [l.get_label() for l in lines]) plt.draw(); plt.show() 
From: Phillip M. Feldman <pfeldman@ve...>  20091028 23:57:53

This is tremendous. thanks!! Phillip JaeJoon Lee wrote: > On Wed, Oct 28, 2009 at 7:20 PM, Phillip M. Feldman > <pfeldman@...> wrote: > >> If I get one yaxis with the 'host', and each invocation of twinx adds >> another yaxis, then it seems that I must invoke twinx three times to get >> four yaxes. Does twinx add more than one yaxis per invocation? (The >> documentation that I've been able to find is ambiguous about this). >> > > twinx add a single axes. > In your original code, you were calling twinx 4times. > > See if the attached code works. > > While I acknowledge that using spines with multiple yaxis is a bit > tricky, I don't think the situation will change anytime soon. > > Regards, > > JJ > 
Sign up for the SourceForge newsletter:
No, thanks