Python  - Matplotlib                                                       Home : www.sharetechnote.com

Matplotlib - 2D Graph

Matplotlib 2D Graph is pretty similar to Matlab 2D Plot in terms of syntax and functionality. If you are familiar with Matlab 2D plot, it would be easier to learn Matplotlib plot. But I noticed Matplotlib has many more functionalities that are not supported by Matlab.

NOTE : To use matplotlib you need to install matplotlib package first. For the package installation, refer to here.

plot

There are two ways of plotting, one with default pyplot object and the other one with axes object. If you are familiar with matlab plot functions, you may not need to learn anything new for the default pyplot object. Plotting with axes object would require a little bit more extra steps but it would be more flexible in terms of defining the plotting area in the figure window etc. When I first started using matplotlib, I mostly used the default pyplot object since the syntax and concept is almost same as Matlab that I am already used to but I get to turn more to axes object due to the extra flexibility.

plot with default pyplot

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.plot(t,np.sin(t),'r-') plt.xlabel('t') plt.ylabel('sin(t)') plt.show();

plot with axes

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure()   rect1 = [0.1, 0.1, 0.8, 0.8]; ax1 = fig.add_axes(rect1);   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t))   fig.show()

multiple graphs in single plot

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.plot(t,np.sin(t),'r-',t,np.sin(2*t),'b--') plt.xlabel('t') plt.ylabel('sin(t)') plt.show();

subplot

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.subplot(2,2,1); plt.plot(t,np.sin(t));   plt.subplot(2,2,2); plt.plot(t,np.sin(2*t));   plt.subplot(2,2,3); plt.plot(t,np.sin(3*t));   plt.subplot(2,2,4); plt.plot(t,np.sin(4*t));   plt.show();

subplot with different size

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.subplot(2,1,1); plt.plot(t,np.sin(t));   plt.subplot(2,2,3); plt.plot(t,np.sin(3*t));   plt.subplot(2,2,4); plt.plot(t,np.sin(4*t));   plt.show();

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);     plt.subplot(2,2,1); plt.plot(t,np.sin(t));   plt.subplot(2,2,2); plt.plot(t,np.sin(2*t));   plt.subplot(2,1,2); plt.plot(t,np.sin(3*t));   plt.show();

spacing between subplots

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.subplot(2,2,1); plt.plot(t,np.sin(t));   plt.subplot(2,2,2); plt.plot(t,np.sin(2*t));   plt.subplot(2,2,3); plt.plot(t,np.sin(3*t));   plt.subplot(2,2,4); plt.plot(t,np.sin(4*t));   plt.tight_layout(pad=4.0)   plt.show();

 import matplotlib.pyplot as plt import numpy as np   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.subplot(2,2,1); plt.plot(t,np.sin(t));   plt.subplot(2,2,2); plt.plot(t,np.sin(2*t));   plt.subplot(2,2,3); plt.plot(t,np.sin(3*t));   plt.subplot(2,2,4); plt.plot(t,np.sin(4*t));   plt.tight_layout(w_pad=4.0, h_pad = 2)   plt.show();

Multiplot with multiple axis

multiplot with same size

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure() rect1 = [0.1, 0.5, 0.8, 0.4]; rect2 = [0.1, 0.1, 0.8, 0.4]; ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax2.plot(t,np.cos(t));   fig.show()

Multiplot with difference size

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure() rect1 = [0.1, 0.4, 0.8, 0.5]; rect2 = [0.1, 0.1, 0.8, 0.3]; ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax2.plot(t,np.cos(t));   fig.show()

Multiplot with Arbitrary Size

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure() rect1 = [0.1, 0.5, 0.8, 0.4]; rect2 = [0.1, 0.1, 0.8, 0.3]; ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax2.plot(t,np.cos(t));   fig.show()

 fig = plt.figure() rect1 = [0.1, 0.5, 0.3, 0.4]; rect2 = [0.5, 0.5, 0.4, 0.3]; rect3 = [0.1, 0.1, 0.8, 0.3];   ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2)) ax3 = fig.add_axes(rect3,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 80)

Setting the size of a figure window

You can set the size of the figure when you creates a figure.

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure(figsize=[8,4])  # the size is configured in inches rect1 = [0.1, 0.4, 0.8, 0.5]; rect2 = [0.1, 0.1, 0.8, 0.3]; ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax2.plot(t,np.cos(t));   fig.show()

Setting the size with gcf()

or you can change the size of the figure after a figure is created.

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure() rect1 = [0.1, 0.4, 0.8, 0.5]; rect2 = [0.1, 0.1, 0.8, 0.3]; ax1 = fig.add_axes(rect1,                    xticklabels=[], ylim=(-1.2, 1.2)) ax2 = fig.add_axes(rect2,                    ylim=(-1.2, 1.2))   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax2.plot(t,np.cos(t));   plt.gcf().set_size_inches(8, 4)  # changes figure size in inches   fig.show()

Setting x,y range

Setting x,y range for plt plot

The way to set x,y range is slighly different depending on how you plot.

 import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 2*np.pi, 0.1); y = np.sin(x); plt.plot(x, y) plt.xlim([0,2*np.pi]); plt.ylim([-2,2]); plt.show()

Setting x, y range for axes plot

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure()   rect1 = [0.1, 0.5, 0.8, 0.4]; rect2 = [0.1, 0.1, 0.8, 0.3];   ax1 = fig.add_axes(rect1) ax1.set_xlim([0,4*np.pi]); ax1.set_ylim([-2,2]);   ax2 = fig.add_axes(rect2) ax2.set_xlim([0,2*np.pi]); ax2.set_ylim([-2,2]);   t = np.linspace(0, 10, 40) ax1.plot(2*t,np.sin(t)) ax2.plot(t,np.cos(t));   fig.show()

Formatting Axis Tick Label

Formatting Number in Scientific format

 import numpy as np import matplotlib.pyplot as plt   x = np.linspace(0,1000,100); plt.plot(x,np.exp(0.01*x)); plt.ticklabel_format(axis="y", style="sci", scilimits=(0,0)) plt.show()

Marker Format - Color, Size etc

Marker Format - Size, Face Color

 import numpy as np import matplotlib.pyplot as plt   x = np.linspace(0,4,10); plt.plot(x,np.exp(x),'o',          markersize=10,          markerfacecolor='red'); plt.show()

Marker Format - Edge Color, Edge Width

 import numpy as np import matplotlib.pyplot as plt   x = np.linspace(0,4,10); plt.plot(x,np.exp(x),'o',          markersize=10,          markerfacecolor='red',          markeredgecolor='blue',          markeredgewidth=2); plt.show()

Ticks and Tick Labels

Setting User Defined Tikcs

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.xticks(ticks=[0,0.5*pi,pi,1.5*pi,2*pi]); plt.show()

Setting User Defined Tick Label

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.xticks(ticks=[0,0.5*pi,pi,1.5*pi,2*pi],labels=["0","0.5*pi","pi","1.5*pi","2*pi"]); plt.show()

Rotating Tick Label Text

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.xticks(ticks=[0,0.5*pi,pi,1.5*pi,2*pi],labels=["0","0.5*pi","pi","1.5*pi","2*pi"]); plt.xticks(rotation=45); plt.show()

Line Thicknenss

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-',linewidth = 1); plt.plot(x,np.cos(x),'b-',linewidth = 3);   plt.show()

Line Color

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.plot(x,np.sin(2*x),color='lightcoral'); plt.plot(x,np.sin(3*x),color='#00FF00');   plt.show()

Line Style

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.plot(x,np.sin(2*x),'b--'); plt.plot(x,np.sin(3*x),linestyle=(0,(5,2,1,2))); # (offset,(0n,Off,On,Off)) plt.plot(x,np.sin(4*x),linestyle=(10,(5,2,3,2))); # (offset,(0n,Off,On,Off))   plt.show()

Legend

Legend - Default

Adding a legend is simple.. it is just call legend(), but you should specify the label for each plot and that label will appear in the legend box.

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-',label='sin(x)'); plt.plot(x,np.sin(2*x),color='lightcoral',label='sin(2 x)'); plt.plot(x,np.sin(3*x),color='#555555',label='sin(3 x)'); plt.legend(); plt.show()

Legend with specified label

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.plot(x,np.sin(2*x),color='lightcoral'); plt.plot(x,np.sin(3*x),color='#555555'); plt.legend(['sin(x)', 'sin(2 x)', 'sin(3 x)']); plt.show()

Legend at the specified location

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.plot(x,np.sin(2*x),color='lightcoral'); plt.plot(x,np.sin(3*x),color='#555555'); plt.legend(['sin(x)', 'sin(2 x)', 'sin(3 x)'], loc = 'lower left'); plt.show()

Legend - Horizontal Direction

 import numpy as np import matplotlib.pyplot as plt   pi = np.pi; x = np.linspace(0,2*np.pi,60); plt.plot(x,np.sin(x),'b-'); plt.plot(x,np.sin(2*x),color='lightcoral'); plt.plot(x,np.sin(3*x),color='#555555'); plt.legend(['sin(x)', 'sin(2 x)', 'sin(3 x)'], loc = 'lower center', ncol = 3); plt.show()

Turning Off Frame

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure()   rect1 = [0.1, 0.1, 0.8, 0.8]; ax1 = fig.add_axes(rect1);   t = np.linspace(0, 10, 40) ax1.plot(t,np.sin(t)) ax1.set(frame_on=False) ax1.set_xticks([]); ax1.set_yticks([]);   fig.show()

 import matplotlib.pyplot as plt import numpy as np   t = np.linspace(0, 10, 40)   plt.plot(t,np.sin(t)) plt.box(False); plt.xticks([]); plt.yticks([]);   plt.show()

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure()   rect1 = [0.2, 0.2, 0.6, 0.6]; ax1 = fig.add_axes(rect1);   t = np.linspace(0, 10, 40)   ax1.plot(t,np.sin(t), 'r-') ax1.set_ylabel('sin(t)',color='red');   ax2 = ax1.twinx(); ax2.plot(t,np.exp(t), 'b-'); ax2.set_ylabel('exp(t)',color='blue');   fig.show()

 import matplotlib.pyplot as plt import numpy as np   fig = plt.figure()   rect1 = [0.2, 0.2, 0.6, 0.6]; ax1 = fig.add_axes(rect1);   t1 = np.linspace(0, 10, 40) t2 = np.linspace(0, 10, 20)   ax1.plot(t1,np.sin(t1), 'r-') ax1.scatter(t1,np.sin(t1), s = 16, c = 'red'); ax1.set_ylabel('sin(t)',color='red');   ax2 = ax1.twinx(); ax2.plot(t2,np.exp(t2), 'b-'); ax2.scatter(t2,np.exp(t2), s = 16, c = 'blue'); ax2.set_ylabel('exp(t)',color='blue');   fig.show()

Stacked Plot

Stacked Plot - Default

 import numpy as np import matplotlib.pyplot as plt   y1 = [1,4,3,5,3]; y2 = [12,2,8,2,1]; y3 = [4,10,5,1,8]; x=range(1,6);   plt.stackplot(x,[y1,y2,y3]); plt.show();

Stacked Plot with Legend

 import numpy as np import matplotlib.pyplot as plt   y1 = [1,4,3,5,3]; y2 = [12,2,8,2,1]; y3 = [4,10,5,1,8]; x=range(1,6);   plt.stackplot(x,[y1,y2,y3],labels=['Y1','Y2','Y3']); plt.legend(loc='upper right') plt.show();

Histogram

Histogram with frequencies / Default Bins

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   r = randn(5000);   plt.hist(r); plt.xlim([-6,6]); plt.show();

Histogram with frequencies / User defined bins

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   r = randn(5000);   bins = np.linspace(-6,6,50); plt.hist(r,bins); plt.xlim([-6,6]); plt.show();

Histogram with probability desity

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   r = randn(5000);   bins = np.linspace(-6,6,50); plt.hist(r,bins,density=True); plt.xlim([-6,6]); plt.show();

Histogram - Constrolling Bar Spacing

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   r = randn(5000);   bins = np.linspace(-6,6,50); plt.hist(r,bins,rwidth=0.9,density=True); plt.xlim([-6,6]); plt.show();

Histogram 2D

Histogram 2D - Default

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(10000); y = 2 * x + 2*randn(10000);   plt.hist2d(x,y); plt.xlim([-6,6]); plt.show();

Histogram 2D - x, y bins

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(10000); y = 2 * x + 2*randn(10000);   xbin = np.linspace(-6,6,40); ybin = np.linspace(-10,10,40);   plt.hist2d(x,y,bins=[xbin,ybin]); plt.xlim([-6,6]); plt.show();

Histogram 2D - Probability Density

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(10000); y = 2 * x + 2*randn(10000);   xbin = np.linspace(-6,6,40); ybin = np.linspace(-10,10,40);   plt.hist2d(x,y,bins=[xbin,ybin],density=True); plt.xlim([-6,6]); plt.show();

Histogram 2D - Setting the lower boundary

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(10000); y = 2 * x + 2*randn(10000);   xbin = np.linspace(-6,6,40); ybin = np.linspace(-10,10,40);   plt.hist2d(x,y,bins=[xbin,ybin],density=True, cmin = 0.001); plt.xlim([-6,6]); plt.show();

Histogram 2D - Setting the upper boundary

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(10000); y = 2 * x + 2*randn(10000);   xbin = np.linspace(-6,6,40); ybin = np.linspace(-10,10,40);   plt.hist2d(x,y,bins=[xbin,ybin],density=True, cmax = 0.02); plt.xlim([-6,6]); plt.show();

Scatter Plot

Scatter Plot - Default

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(500); y = randn(500);   plt.scatter(x,y); plt.xlim([-5,5]); plt.ylim([-5,5]); plt.show();

Scatter Plot - Setting Marker Color

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(500); y = randn(500);   plt.scatter(x,y-1,s=3,c='red'); plt.scatter(x+1,y+1,s=4,c='blue'); plt.scatter(x-1,y+1,s=4,c='green'); plt.xlim([-5,5]); plt.ylim([-5,5]); plt.show();

Scatter Plot - Setting Marker Size

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(200); y = randn(200); z = range(200);   plt.scatter(x,y,s=30,c=z); plt.xlim([-5,5]); plt.ylim([-5,5]); plt.show();

 import matplotlib.pyplot as plt import numpy as np from numpy.random import seed from numpy.random import randn   seed(1)   x = randn(200); y = randn(200); z = range(200);   plt.scatter(2*x,2*y,s=z,c=z); plt.xlim([-5,5]); plt.ylim([-5,5]); plt.show();

Filled Polygon

Filled Polygon - Default

 import matplotlib.pyplot as plt   px = [-1.0, 0.5, 0.6,  1.0]; py = [-1.0, 1.0, 0.0, -1.0];   plt.fill(px,py); plt.show();

Filled Polygon - Face Color, Line Color, LineWidth

 import matplotlib.pyplot as plt   px = [-1.0, 0.5, 0.6,  1.0]; py = [-1.0, 1.0, 0.0, -1.0];   plt.fill(px,py,facecolor='green', edgecolor='red', linewidth=3); plt.show();

Filled Polygon - No Fill

 import matplotlib.pyplot as plt import numpy as np   px = [2.0, 2.0, 4.0, 4.0]; py = [-1.0, 1.0, 1.0, -1.0];   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.plot(t,np.sin(t),'b-',t,np.sin(2*t),'b--') plt.fill(px,py,facecolor='none', edgecolor='red', linewidth=3); plt.xlabel('t') plt.ylabel('sin(t)') plt.show();

Filled Polygon - Transparency

 import matplotlib.pyplot as plt import numpy as np   px = [2.0, 2.0, 4.0, 4.0]; py = [-1.0, 1.0, 1.0, -1.0];   pi = np.pi; t = np.linspace(0,2*pi,80);   plt.plot(t,np.sin(t),'b-',t,np.sin(2*t),'b--') plt.fill(px,py,facecolor='green', edgecolor='red', linewidth=3, alpha = 0.25); plt.xlabel('t') plt.ylabel('sin(t)') plt.show();

Reference :