Simple plot
Info |
---|
Visit this page for full documentation on simple plots using pyplot. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import numpy as np import matplotlib.pyplot as plt # Evenly sampled time from 0s to 10s at 200ms intervals t = np.arange(0.0, 10.0, 0.2) # Plotting t at x-axis and sin(t) at y-axis plt.plot(t, np.sin(t)) # Naming the title and both axis plt.title('Sinus function') plt.ylabel('sin(t)') plt.xlabel('t [s]') # Need to call the show() function at the end to display my figure plt.show() |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import numpy as np import matplotlib.pyplot as plt # Evenly sampled time at 200ms intervals t = np.arange(0.0, 5.0, 0.2) # plot() can plot several lines in the same figure. To seperate the different lines # from eachother, we may change the line style and format strings. # See the plot() documentation for a complete list of line styles and format strings. # The following lines have red dashes, blue squares and green triangles plt.plot(t, t, 'r--', label='Linear line') plt.plot(t, t**2, color='blue', linestyle='none', marker='s', label='Second degree polynom') plt.plot(t, t**3, 'g^', label='Third degree polynom') # To describe our plot even more detailed we can draw the labels we previously gave our lines using legend. plt.legend(loc='upper left') # The function axis() sets the axis sizes, and takes the argument [xmin, xmax, ymin, ymax] plt.axis([0, 5, 0, 100]) plt.title('Mulitple polynoms') plt.show() |
Info |
---|
More in-depth plot() documentation and legend() documentation. |
Multiple figures and subplots
Info |
---|
A very good and more detailed guide on subplots and figures can be found here. |
Code Block | ||
---|---|---|
| ||
import matplotlib.pyplot as plt import numpy as np # Some example data to display x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) |
A single plot
subplots() without arguments return a Figure and a single Axes. When dealing with multiple plots in the same figure, the different axes will seperate the different plots from eachother within the figure.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
fig, ax = plt.subplots() fig.suptitle('A single plot') ax.plot(x, y) |
Stacking subplots in one direction
The first two optional arguments of pyplot.subplots() define the number of rows and columns of the subplot grid.
When stacking in one direction only, the returned axs is a 1D numpy array containing the list of created Axes.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
fig, axs = plt.subplots(2) fig.suptitle('Vertically stacked subplots') axs[0].plot(x, y) axs[1].plot(x, -y) |
If you are creating just a few Axes, it's handy to unpack them immediately to dedicated variables for each Axes. That way, we can use ax1 instead of the more verbose axs[0].
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
fig, (ax1, ax2) = plt.subplots(2) fig.suptitle('Vertically stacked subplots') ax1.plot(x, y) ax2.plot(x, -y) |
To obtain side-by-side subplots, pass parameters 1, 2 for one row and two columns.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
fig, (ax1, ax2) = plt.subplots(1, 2) fig.suptitle('Horizontally stacked subplots') ax1.plot(x, y) ax2.plot(x, -y) |
Stacking subplots in two directions
When stacking in two directions, the returned axs is a 2D numpy array. If you have to set parameters for each subplot it's handy to iterate over all subplots in a 2D grid using for ax in axs.flat:.
Info |
---|
axes.flat is not a function, it's an atribute of the numpy.ndarray. ndarray.flat is a 1-D iterator over the array. This is a numpy.flatiter instance, which acts similarly to, but is not a subclass of, Python’s built-in iterator object. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
fig, axs = plt.subplots(2, 2) fig.suptitle('Stacking subplots in two directions') axs[0, 0].plot(x, y) axs[0, 0].set_title('Axis [0,0]') axs[0, 1].plot(x, y, 'tab:orange') axs[0, 1].set_title('Axis [0,1]') axs[1, 0].plot(x, -y, 'tab:green') axs[1, 0].set_title('Axis [1,0]') axs[1, 1].plot(x, -y, 'tab:red') axs[1, 1].set_title('Axis [1,1]') for ax in axs.flat: ax.set(xlabel='x-label', ylabel='y-label') # Hide x labels and tick labels for top plots and y ticks for right plots. for ax in axs.flat: ax.label_outer() |
Quiver plot
Info |
---|
More in-depth quiver documentation and functions. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import numpy as np import matplotlib.pyplot as plt # X and Y define the arrow locations X, Y = np.meshgrid(np.arange(0, 2 * np.pi, .2), np.arange(0, 2 * np.pi, .2)) # U and V define the arrow directions, respectively in x- and y-direction U = np.cos(X) V = np.sin(Y) # Call signature: quiver([X, Y], U, V, [C]), where C optionally sets the color plt.quiver(X, Y, U, V) plt.title('Simple quiver plot') plt.show() |
Note |
---|
The plot autoscaling does not take into account the arrows, so those on the boundaries may reach out of the picture. This is not an easy problem to solve in a perfectly general way. The recommended workaround is to manually set the Axes limits in such a case. An example showing autoscaling vs manually is shown below. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import numpy as np import matplotlib.pyplot as plt # X and Y define the arrow locations # This setup gives us 10 arrows in width and height, as our interval is from -5 to 5 with step 1 X = np.arange(-5, 5, 1) Y = np.arange(-5, 5, 1) # U and V define the arrow directions, respectively in x- and y-direction U, V = np.meshgrid(3*X, 3*Y) plt.figure() plt.subplot(121) plt.quiver(X, Y, U, V) plt.title('Only autoscaling') plt.subplot(122) plt.quiver(X, Y, U, V) # Here we specify the axes. How much extra space you need depends on the arrow size and direction, # and must therefore be adapted each time plt.axis([-6.5, 5.5, -6.5, 5.5]) plt.title('Manually set axes') plt.show() |