目录
前言1.基本使用1.1 基本用法1.2 figure图像1.3 设置坐标轴11.4 设置坐标轴21.5 Legend图例1.6 Annotation标注1.7 tick能见度2.画图种类2.1 Scatter散点图2.2 Bar柱状图2.3 Contours等高线图2.4 Image图片2.5 3D数据3.多图合并显示3.1 Subplot多合一显示3.2 Subplot分格显示3.3 图中图3.4 次坐标轴4.动画4.1 Animation动画结语参考前言
莫烦老师Matplotlib教程,将所有代码和对应的图记录在博客中,方便自己后续查看
作者:莫烦Python
转自:/tutorials/data-manipulation/plt/
视频:【莫烦Python】Matplotlib Python画图教程
代码:/MorvanZhou/tutorials/tree/master/matplotlibTUT
环境:python-3.9.13 matplotlib-3.5.2 numpy-1.21.5
1.基本使用
1.1 基本用法
# 3 - simple plotimport matplotlib.pyplot as pltimport numpy as npx = np.linspace(-1, 1, 50)y = 2 * x + 1y1 = x ** 2plt.plot(x, y1)plt.show()
simple_plot
1.2 figure图像
plt.figure() 新建一个画布,以下所有图像都在这个画布中 num 画布名称figsize 画布大小,tuple类型 plt.plot() color 颜色,str类型linewidth 线宽,float类型linestyle 线类型 str类型# 4 - figureimport matplotlib.pyplot as pltimport numpy as npx = np.linspace(-3, 3, 50)y1 = 2 * x + 1y2 = x ** 2plt.figure()plt.plot(x, y1)plt.figure(num=3, figsize=(8,5))plt.plot(x, y2)# plot the second curve in this figure with certain parametersplt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')plt.show()
figure_1figure_2
1.3 设置坐标轴1
修改坐标轴的刻度和文字描述
plt.xlim() plt.ylim() 修改x/y坐标轴的范围,接收tuple类型plt.xlabel() plt.ylabel() 修改x/y坐标轴的标签,接收str类型plt.xticks() plt.yticks() 第一个参数修改新的刻度,接收list类型第二个参数修改对应刻度的名称,接收list类型,为了字体一致可选择数学公式+r(正则表达形式)
# 5 - axis settingimport matplotlib.pyplot as pltimport numpy as npx = np.linspace(-3, 3, 50)y1 = 2 * x + 1y2 = x ** 2plt.figure()plt.plot(x, y2)plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')# set x limitsplt.xlim((-1, 2))plt.ylim((-2, 3))plt.xlabel('I am x')plt.ylabel('I am y')# set new sticksnew_ticks = np.linspace(-1, 2, 5)print(new_ticks)plt.xticks(new_ticks)# set tick labelsplt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])plt.show()
axis setting1
1.4 设置坐标轴2
修改坐标轴位置
plt.gca() 获取当前的轴plt.gca().xaxis.set_ticks_position() 设置x轴plt.gca().spines[].set_position(()) 设置原点设置刻度尺朝向 参考自matplotlib:刻度线的方向调整
# 6 - axis settingimport matplotlib.pyplot as pltimport numpy as np# plt.rcParams['xtick.direction'] = 'in' # 将x轴的刻度方向设置向内# plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内x = np.linspace(-3, 3, 50)y1 = 2 * x + 1y2 = x ** 2plt.figure()plt.plot(x, y2)# plot the second curve in this figure with certain parametersplt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')# set x limitsplt.xlim((-1, 2))plt.ylim((-2, 3))# set new sticksnew_ticks = np.linspace(-1, 2, 5)print(new_ticks)plt.xticks(new_ticks)# set tick labelsplt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])# to use '$ $' for math text and nice looking, e.g. '$\pi$'# gca = 'get current axis'ax = plt.gca()ax.spines['right'].set_color('none') # 去除右轴ax.spines['top'].set_color('none')# 去除上轴ax.xaxis.set_ticks_position('bottom') # 设置下轴为x轴# ACCEPTS: [ 'top' | 'bottom' | 'both' | 'default' | 'none' ]ax.spines['bottom'].set_position(('data', 0)) # 设置y轴原点为0# the 1st is in 'outward' | 'axes' | 'data'# axes: percentage of y axis# data: depend on y dataax.yaxis.set_ticks_position('left')# 设置左轴为y轴# ACCEPTS: [ 'left' | 'right' | 'both' | 'default' | 'none' ]ax.spines['left'].set_position(('data', 0)) # 设置x轴原点为0plt.show()
axis setting2
1.5 Legend图例
添加Legend图例,帮助展示出每个数据对应的图像名称
plt.legend()
# 7 - legendimport matplotlib.pyplot as pltimport numpy as np# plt.rcParams['xtick.direction'] = 'in' # 将x轴的刻度方向设置向内# plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内x = np.linspace(-3, 3, 50)y1 = 2 * x + 1y2 = x ** 2plt.figure()# set x limitsplt.xlim((-1, 2))plt.ylim((-2, 3))# set new sticksnew_ticks = np.linspace(-1, 2, 5)print(new_ticks)plt.xticks(new_ticks)# set tick labelsplt.yticks([-2, -1.8, -1, 1.22, 3],[r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])l1, = plt.plot(x, y1, label='linear line')l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')plt.legend(loc='upper right')# plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='best')# the "," is very important in here l1, = plt... and l2, = plt... for this step"""legend( handles=(line1, line2, line3),labels=('label1', 'label2', 'label3'),'upper right')The *loc* location codes are::'best' : 0,(currently not supported for figure legends)'upper right' : 1,'upper left' : 2,'lower left' : 3,'lower right' : 4,'right' : 5,'center left' : 6,'center right' : 7,'lower center' : 8,'upper center' : 9,'center' : 10,"""plt.show()
legend
1.6 Annotation标注
plt.annotation() 加注释plt.text() 加文字描述# 8 - annotationimport matplotlib.pyplot as pltimport numpy as np# plt.rcParams['xtick.direction'] = 'in' # 将x轴的刻度方向设置向内# plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内x = np.linspace(-3, 3, 50)y = 2 * x + 1plt.figure(num=1, figsize=(8,5),)plt.plot(x, y,)ax = plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.spines['bottom'].set_position(('data', 0))ax.yaxis.set_ticks_position('left')ax.spines['left'].set_position(('data', 0))x0 = 1y0 = 2 * x0 + 1plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)plt.scatter([x0, ], [y0, ], s=50, color='b')# method 1:#####################plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30),textcoords='offset points', fontsize=16,arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))# method 2:########################plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',fontdict={'size': 16, 'color': 'r'})plt.show()
annotation
1.7 tick能见度
# 9 - tick_visibilityimport matplotlib.pyplot as pltimport numpy as np# plt.rcParams['xtick.direction'] = 'in' # 将x轴的刻度方向设置向内# plt.rcParams['ytick.direction'] = 'in' # 将y轴的刻度方向设置向内x = np.linspace(-3, 3, 50)y = 0.1 * xplt.figure()plt.plot(x, y, linewidth=10, zorder=1)# set zorder for ordering the plot in plt 2.0.2 or higherplt.ylim(-2, 2)ax = plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')ax.xaxis.set_ticks_position('bottom')ax.spines['bottom'].set_position(('data', 0))ax.yaxis.set_ticks_position('left')ax.spines['left'].set_position(('data', 0))print(ax.get_xticklabels())for label in ax.get_xticklabels() + ax.get_yticklabels():label.set_fontsize(12)# set zorder for ordering the plot in plt 2.0.2 or higherlabel.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.8, zorder=2))plt.show()
tick visibility
2.画图种类
2.1 Scatter散点图
# 10 - scatterimport matplotlib.pyplot as pltimport numpy as npn = 1024 # data sizeX = np.random.normal(0, 1, n) # 均值为0方差为1的高斯分布Y = np.random.normal(0, 1, n)T = np.arctan2(Y, X) # for color later onplt.scatter(X, Y, s=75, c=T, alpha=.5)plt.xlim(-1.5, 1.5)plt.xticks(()) # ignore xticksplt.ylim(-1.5, 1.5)plt.yticks(()) # ignore yticksplt.show()
scatter
2.2 Bar柱状图
# 11 - barimport matplotlib.pyplot as pltimport numpy as npn = 12X = np.arange(n)Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')for x, y in zip(X, Y1):# ha: horizontal alignment# va: vertical alignmentplt.text(x + 0.04, y + 0.02, '%.2f' % y, ha='center', va='bottom')for x, y in zip(X, Y2):# ha: horizontal alignment# va: vertical alignmentplt.text(x + 0.04, -y - 0.02, '%.2f' % y, ha='center', va='top')plt.xlim(-.5, n)plt.xticks(())plt.ylim(-1.1, 1.1)plt.yticks(())plt.show()
bar
2.3 Contours等高线图
# 12 - contoursimport matplotlib.pyplot as pltimport numpy as npdef f(x, y):# the height functionreturn (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)n = 256x = np.linspace(-3, 3, n)y = np.linspace(-3, 3, n)X, Y = np.meshgrid(x, y)print(X)print(Y)# use plt.contourf to filling contours# X, Y and value for (X,Y) pointplt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)# use plt.coutour to add contour linesC = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)# adding labelplt.clabel(C, inline=True, fontsize=10)plt.xticks(())plt.yticks(())plt.show()
contours
2.4 Image图片
# 13 - imageimport matplotlib.pyplot as pltimport numpy as np# image dataa = np.array([0.313660827978, 0.365348418405, 0.42373314,0.365348418405, 0.439599930621, 0.525083754405,0.42373314, 0.525083754405, 0.651536351379]).reshape(3,3)"""for the value of "interpolation", check this:/examples/images_contours_and_fields/interpolation_methods.htmlfor the value of "origin"= ['upper', 'lower'], check this:/examples/pylab_examples/image_origin.html"""plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')plt.colorbar(shrink=.92)plt.xticks(())plt.yticks(())plt.show()
image
2.5 3D数据
# 14 - 3dimport matplotlib.pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = Axes3D(fig)# X, Y valueX = np.arange(-4, 4, 0.25)Y = np.arange(-4, 4, 0.25)X, Y = np.meshgrid(X, Y)R = np.sqrt(X ** 2 + Y ** 2)# height valueZ = np.sin(R)ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))"""============= ================================================ArgumentDescription============= ================================================*X*, *Y*, *Z* Data values as 2D arrays*rstride*Array row stride (step size), defaults to 10*cstride*Array column stride (step size), defaults to 10*color* Color of the surface patches*cmap* A colormap for the surface patches.*facecolors* Face colors for the individual patches*norm* An instance of Normalize to map values to colors*vmin* Minimum value to map*vmax* Maximum value to map*shade* Whether to shade the facecolors============= ================================================"""# This is different from plt12_contoursax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))"""========== ================================================Argument Description========== ================================================*X*, *Y*, Data values as numpy.arrays*Z**zdir*The direction to use: x, y or z (default)*offset* If specified plot a projection of the filled contouron this position in plane normal to zdir========== ================================================"""ax.set_zlim(-2, 2)plt.show()
3D
3.多图合并显示
3.1 Subplot多合一显示
# 15 - subplotfrom dataclasses import dataclassimport matplotlib.pyplot as plt# example 1:###############################plt.figure(figsize=(6, 4))# plt.subplot(n_rows, n_cols, plot_num)plt.subplot(2, 2, 1)plt.plot([0, 1], [0, 1])plt.subplot(222)plt.plot([0, 1], [0, 2])plt.subplot(223)plt.plot([0, 1], [0, 3])plt.subplot(224)plt.plot([0, 1], [0, 4])plt.tight_layout()# example 2:###############################plt.figure(figsize=(6, 4))# plt.subplot(n_rows, n_cols, plot_num)plt.subplot(2, 1, 1)# figure splits into 2 rows, 1 col, plot to the 1st sub-figplt.plot([0, 1], [0, 1])plt.subplot(234)# figure splits into 2 rows, 3 col, plot to the 4th sub-figplt.plot([0, 1], [0, 2])plt.subplot(235)# figure splits into 2 rows, 3 col, plot to the 5th sub-figplt.plot([0, 1], [0, 3])plt.subplot(236)# figure splits into 2 rows, 3 col, plot to the 6th sub-figplt.plot([0, 1], [0, 4])plt.tight_layout()plt.show()
subplot1subplot2
3.2 Subplot分格显示
# 16 - gridimport matplotlib.pyplot as pltimport matplotlib.gridspec as gridspec# method 1: subplot2grid##########################plt.figure()ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) # stands for axesax1.plot([1, 2], [1, 2])ax1.set_title('ax1_title')ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)ax4 = plt.subplot2grid((3, 3), (2, 0))ax4.scatter([1, 2], [2, 2])ax4.set_xlabel('ax4_x')ax4.set_ylabel('ax4_y')ax5 = plt.subplot2grid((3, 3), (2, 1))# method 2: gridspec#########################plt.figure()gs = gridspec.GridSpec(3, 3)# use index form 0ax6 = plt.subplot(gs[0, :])ax7 = plt.subplot(gs[1, :2])ax8 = plt.subplot(gs[1:, 2])ax9 = plt.subplot(gs[-1, 0])ax10 = plt.subplot(gs[-1, -2])# method 3: easy to define structure####################################f, ((ax11, ax12), (ax13, ax14)) = plt.subplots(2, 2, sharex=True, sharey=True)ax11.scatter([1, 2], [1, 2])plt.tight_layout()plt.show()
grid1grid2grid3
3.3 图中图
# 17 - plot in plotimport matplotlib.pyplot as pltfig = plt.figure()x = [1, 2, 3, 4, 5, 6, 7]y = [1, 3, 4, 2, 5, 8, 6]# below are all percentageleft, bottom, width, height = 0.1, 0.1, 0.8, 0.8ax1 = fig.add_axes([left, bottom, width, height]) # main axesax1.plot(x, y, 'r')ax1.set_xlabel('x')ax1.set_ylabel('y')ax1.set_title('title')ax2 = fig.add_axes([0.2, 0.6, 0.25, 0.25]) # inside axesax2.plot(y, x, 'b')ax2.set_xlabel('x')ax2.set_ylabel('y')ax2.set_title('title inside 1')# different method to add axes####################################plt.axes([0.6, 0.2, 0.25, 0.25])plt.plot(y[::-1], x, 'g')plt.xlabel('x')plt.ylabel('y')plt.title('title inside 2')plt.show()
plot in plot
3.4 次坐标轴
# 18 - secondary y axisimport matplotlib.pyplot as pltimport numpy as npx = np.arange(0, 10, 0.1)y1 = 0.05 * x ** 2y2 = -1 * y1fig, ax1 = plt.subplots()ax2 = ax1.twinx() # mirror the ax1ax1.plot(x, y1, 'g-')ax2.plot(x, y2, 'b-')ax1.set_xlabel('X data')ax1.set_ylabel('Y1 data', color='g')ax2.set_ylabel('Y2 data', color='b')plt.savefig("18.png")plt.show()
secondary y axis
4.动画
4.1 Animation动画
# 19 - animationimport matplotlib.pyplot as pltfrom matplotlib import animationimport numpy as npfig, ax = plt.subplots()x = np.arange(0, 2 * np.pi, 0.01)line, = ax.plot(x, np.sin(x))def animate(i):line.set_ydata(np.sin(x + i/10.0)) # update the datareturn line,def init():line.set_ydata(np.sin(x))return line,# call the animator. blit=True means only re-draw the parts that have changed.# blit=True dose not work on Mac, set blit=False# interval= update frequencyani = animation.FuncAnimation(fig=fig, func=animate, frames=100, init_func=init, interval=20, blit=False)# save the animation as an mp4. This requires ffmpeg or mencoder to be# installed. The extra_args ensure that the x264 codec is used, so that# the video can be embedded in html5. You may need to adjust this for# your system: for more information, see# /api/animation_api.html# anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])# ani.save("19.gif", writer='imagemagick')plt.show()
animation
结语
代码仅供自己参考,大家可以查看对应的教程视频自行学习。