Difference between revisions of "MatPlotLib Tutorial 1"

From dftwiki3
Jump to: navigation, search
(Two Curves, Stacked, Color under the Curves)
(Two Curves, Stacked, Color under the Curves)
Line 293: Line 293:
 
     plt.show()
 
     plt.show()
 
      
 
      
</python>
+
</source>
 
<br />
 
<br />
 
<br />
 
<br />
Line 325: Line 325:
 
<br />
 
<br />
 
<br />
 
<br />
 +
 
==Adding String Labels for X Values==
 
==Adding String Labels for X Values==
 
[[Image:MatPlotLib_BarGraphWithStringXValues.png|300px|right]]
 
[[Image:MatPlotLib_BarGraphWithStringXValues.png|300px|right]]

Revision as of 23:00, 25 April 2011

--D. Thiebaut 10:27, 25 April 2011 (EDT)



MatPlotLib.png



This tutorial will introduce you to the MatPlotLib Python library for generating graphs.




Other Sources of Information

Setup

We use the Eclipse IDE and PyDev to develop Python packages. If you want to setup your environment to match the one used here you will need to install:

  1. Eclipse: http://www.eclipse.org/downloads/
  2. Python: http://www.python.org/download/
  3. PyDev: http://pydev.org/download.html
  4. EDP from Enthought: https://www.enthought.com/products/. It contains all you need to run MatPlotLib.

Default Python

  • You should make the Python version installed by EDP as the default Python interpreter for Eclipse/PyDev.
  • First open a Terminal window and type:
 which python
 /Library/Frameworks/Python.framework/Versions/Current/bin/python
  • Record the answer to the command and enter it in Eclipse's Preference window for PyDev:

EclipsePyDevDefaultPythonInterpreter.png

Testing


MatPlotLib1.png


Scatter Plot of (X, Y) points

The Simplest Approach

MatPlotLib SimplestApproach.png
  • You have an array of N Y-values, and you want to display them at X-values ranging from 0 to N-1:


def plot2():
    plt.plot([1,3,2,4])
    plt.ylabel('Intensity')
    plt.show()







Changing Colors and Adding Markers

MatPlotLib SimplestApproachColorMarkers.png


def plot3():
    plt.plot([1,3,2,4], 'ro-' )
    plt.ylabel('Intensity')
    plt.show()



To change the color, simply use a string at the last parameter of the plot() function and define the color, 'r' for red, for example, and the type of marker, 'o' for circle. 'ro' would display red circles only. 'ro-' would display red circles linked by a line. This is similar to the Matlab syntax. '--rs' would display a dash line between red squares. ':bs' would display a dotted line between blue squares.




Two list of coordinates

MatPlotLib XYListsCoords.png


def plot4():  
    x = [1, 2, 3, 4, 5, 6]
    y = [1, 2, 4, 3, 6, 5]  
    plt.plot( x, y, ':rs' )
    plt.axis( [0, 10, 0, 6])
    plt.xlabel( "X values" )
    plt.ylabel( "Y values" )
    plt.show()


Here we present the plot with two arrays, one for the X values, one for the Y values. We also define the range of values for the X-axis and the range of values for the Y-axis, and provide labels for each one.

The line and marker styles are defined by ':rs' , meaning dotted line, red square.



What if the List is a List of Pairs of Coordinates?

MatPlotLib XYPairs.png


def plot5():
    data = [ (1, 0), (2, 0.1 ), (3, 1.1), (4, 1.2), (5, 2.3), 
                (6, 3.5), (7, 5.8) ]
    X = [ x for (x,y) in data ]
    Y = [ y for (x,y) in data ]
    #print X
    #print Y
    plt.plot( X, Y, ':rs' )
    plt.axis( [0, 8, 0, 6])
    plt.xlabel( "X values" )
    plt.ylabel( "Y values" )
    plt.show()


We just use Python to break the list of pairs into two lists of numbers, one for x, one for y.


Plotting Two Different Curves

MatPlotLibTwoCurves.png
import numpy as np

def plot6():
    t = np.arange(1, 10, 0.5)
    plt.plot( t, t**2, 'r^--', t, 3*(t**2)-3, 'bs-' )
    plt.show()

Here we plot two functions, one is y = x^2, in red with triangular markers, and dashed line. Then we print y = 3*x^2 -3, with blue squares and a solid line.







Plotting Two Different Curves defined as Lists

MatPlotLibTwoCurvesDefinedByLists.png
def plot7():    
    x1 =[ 1, 2, 5, 10, 15, 20]
    y1 =[ 1.5 * x**2 for x in x1 ]
    x2 = range( 5, 30)
    y2 = [ 0.3 * x**2 -5 for x in x2 ]
    plt.plot( x1, y1, "rs--", x2, y2, ":b^")
    plt.show()


Note that the X-range for the first curve and for the second curve are not the same, but overlap. PyPlot adjusts the display and plots both curves correctly.








Line Graph with String X-Values

A Simple Line of (label, y) Points

LineGraphWithStringXValues.png


def plot11():
    t = np.arange( 0, 200, 1)
    N = len( t )
    y = np.random.rand( N )
    x = np.arange( 1, N+1 )
    labels = [ "data"+str(k) for k in range(1, N+1) ]
    samples = [ '' ] * N
    for i in range( 0, N, N/5 ):
        samples[i] = labels[i]
    width = 1.0
    plt.plot( x, y )
    plt.ylabel( 'Intensity' )
    plt.xticks(x + width/2.0, samples )
    plt.show()


We use some random points with y-values in the range 0 to 200, and x-values of the form "data1", "data2", "data3", etc. The values on the X-axis are printed every fifth of the axis length.

Area-Curve

One Curve, Colored Area Under the Curve

MatPlotLib AreaCurve.png


def plot12():
    t = np.arange( 0, 200, 1)
    N = len( t )
    y = np.random.rand( N )
    x = np.arange( 1, N+1 )
    labels = [ "data"+str(k) for k in range(1, N+1) ]
    samples = [ '' ] * N
    for i in range( 0, N, N/5 ):
        samples[i] = labels[i]
    width = 1.0
    plt.fill_between( x, 0, y, color='y' )
    plt.ylabel( 'Intensity' )
    plt.xticks(x + width/2.0, samples )
    plt.show()







One Curve, Colored Area Above the Curve

MatPlotLib AreaCurve2.png


def plot12():
    t = np.arange( 0, 200, 1)
    N = len( t )
    y = np.random.rand( N )
    x = np.arange( 1, N+1 )
    labels = [ "data"+str(k) for k in range(1, N+1) ]
    samples = [ '' ] * N
    for i in range( 0, N, N/5 ):
        samples[i] = labels[i]
    width = 1.0
    '''plt.fill_between( x, y, 1, color='m' )'''
    plt.ylabel( 'Intensity' )
    plt.xticks(x + width/2.0, samples )
    plt.show()








Two Curves, Stacked, Color under the Curves

MatPlotLibTwoCurvesColoredUnder.png


def plot13():
    t = np.arange( 0, 200, 1)
    N = len( t )
    y1 = np.random.rand( N)
    delta = np.random.rand( N )
    y2 = y1 + delta/2
    x = np.arange( 1, N+1 )
    labels = [ "data"+str(k) for k in range(1, N+1) ]
    samples = [ '' ] * N
    for i in range( 0, N, N/5 ):
        samples[i] = labels[i]
    width = 1.0
    plt.fill_between( x, 0, y1, color='m' )
    plt.fill_between( x, y1, y2, color='y' )
    plt.axis( [0, N, 0, max(y2)] )
    plt.ylabel( 'Intensity' )
    #plt.xticks(x + width/2.0, samples )
    plt.show()






Bar-Graphs

A Simple Bar-Graph

MatPlotLib SimpleBarGraph.png


def plot8():
    y = [ 3, 10, 7, 5, -3, 4.5, 6, 8.1]
    N = len( y )
    x = range( N )
    width = 1/1.5
    plt.bar( x, y, width, color="magenta" )
    plt.show()










Adding String Labels for X Values

MatPlotLib BarGraphWithStringXValues.png


def plot9():
    data = [ ("data1", 34), ("data2", 22),
            ("data3", 11), ( "data4", 28),
            ("data5", 57), ( "data6", 39),
            ("data7", 23), ( "data8", 98)]
    N = len( data )
    x = np.arange(1, N+1)
    y = [ num for (s, num) in data ]
    labels = [ s for (s, num) in data ]
    width = 1
    bar1 = plt.bar( x, y, width, color="y" )
    plt.ylabel( 'Intensity' )
    plt.xticks(x + width/2.0, labels )
    plt.show()






Adding Sampled String Labels for X Values

MatPlotLib BarGraphWithSampledStringXValues.png


def plot10():
    t = np.arange( 0, 200, 1)
    N = len( t )
    y = np.random.rand( N )
    x = np.arange( 1, N+1 )
    labels = [ "data"+str(k) for k in range(1, N+1) ]
    samples = [ '' ] * N
    for i in range( 0, N, N/5 ):
        samples[i] = labels[i]
    width = 1.0
    bar1 = plt.bar( x, y, width, color="y" )
    plt.ylabel( 'Intensity' )
    plt.xticks(x + width/2.0, samples )
    plt.show()