|
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
subplot with same size
|
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
Setting the size with figure( )
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()
|

Adding Secondary Axis
|
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 :
[1] Matplotlib tutorial (Nicolas P. Rougier)
|
|