参考:【莫烦Python】Matplotlib Python 画图教程
matplotlib是强大的绘图工具包。
基本使用
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y = 2*x+1
plt.plot(x,y)
plt.show()
figure图像
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.plot(x,y1)
plt.figure(num=3,figsize=(8,5)) # num是figure的序号,figsize是将x轴分成8等分,将y轴分成5等分
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') # 在figure3增加y1,并设置线参数
plt.show()
设置坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') # 在figure3增加y1,并设置线参数
plt.xlim((-1,2)) # 设置轴的起止位置
plt.ylim((-2,3))
plt.xlabel('I am x') # 设置轴标签
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks) # 设置x轴的间隔数
plt.yticks([-2,-1.8,-1,1.22,3],
['realyly bad','bad','normal','good','reall good']) # 将y轴的数值和指定的字符串对应
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--') # 在figure3增加y1,并设置线参数
plt.xlim((-1,2)) # 设置轴的起止位置
plt.ylim((-2,3))
plt.xlabel('I am x') # 设置轴标签
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks) # 设置x轴的间隔数
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$']) # 将y轴的数值和指定的字符串对应
# gca = 'get current axis'
ax = plt.gca()
# ax.spines是轴的脊梁,也就是轴的边框
ax.spines['right'].set_color('none') # 不显示右边边框
ax.spines['top'].set_color('none') # 不显示上边边框
ax.xaxis.set_ticks_position('bottom') # 设置下边边框为x轴的位置
ax.yaxis.set_ticks_position('left') # 设置左边边框为y轴的位置
ax.spines['bottom'].set_position(('data',-1)) # 设置下边边框(x轴)在y轴的-1处
ax.spines['left'].set_position(('data',0)) # 设置左边边框(y轴)在x轴的0处
plt.show()
label图例
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.xlim((-1,2)) # 设置轴的起止位置
plt.ylim((-2,3))
plt.xlabel('I am x') # 设置轴标签
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks) # 设置x轴的间隔数
plt.yticks([-2,-1.8,-1,1.22,3],
['realyly bad','bad','normal','good','reall good']) # 将y轴的数值和指定的字符串对应
# 给每条线设置一个图例label,好区分
plt.plot(x,y2,label='up')
plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down') # 在figure3增加y1,并设置线参数
# 上面的label默认不打印,要写plt.legend()才能打印
plt.legend()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.xlim((-1,2)) # 设置轴的起止位置
plt.ylim((-2,3))
plt.xlabel('I am x') # 设置轴标签
plt.ylabel('I am y')
new_ticks = np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks) # 设置x轴的间隔数
plt.yticks([-2,-1.8,-1,1.22,3],
['realyly bad','bad','normal','good','reall good']) # 将y轴的数值和指定的字符串对应
# 给每条线设置一个图例label,好区分
# 下面这里必须写一个逗号
l1, = plt.plot(x,y2,label='up')
l2, = plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--',label='down') # 在figure3增加y1,并设置线参数
# loc可以是upper right之类的
# handles输入的就是上面创建的l1,和l2,
# labels会覆盖plt.plot中设置的label
plt.legend(handles=[l1,l2,],labels=['aaa','bbb'],loc='best')
plt.show()
注解annotation
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y = 2*x+1
plt.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') # 设置下边边框为x轴的位置
ax.yaxis.set_ticks_position('left') # 设置左边边框为y轴的位置
ax.spines['bottom'].set_position(('data',0)) # 设置下边边框(x轴)在y轴的-1处
ax.spines['left'].set_position(('data',0)) # 设置左边边框(y轴)在x轴的0处
x0 = 1
y0 = 2*x0+1
plt.scatter(x0,y0,s=50,color='b')
plt.plot([x0,x0],[y0,0],'k--',lw=2.5) # k是黑色
# method 1
# xy和xycoords描述要注解的点,xytext和textcoords表示要注解的文字相对于(x0,y0)的偏移量
# fontsize是注解的字体大小,arrowprops表示用箭头从注解的文字指向注解的点,arc和rad描述弧度和角度
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'))
# method2
plt.text(-3.77,3,r'$This\ is\ the\ some\ text.\ \mu\ \sigma_i\ \alpha_t$',
fontdict={'size':16,'color':'r'})
plt.show()
tick能见度
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y = 0.1*x
plt.figure()
plt.plot(x,y,linewidth=10,alpha=0.5) # 设置线的能见度,不让他挡住tick
plt.ylim(-2,2)
ax = plt.gca()
ax.spines['right'].set_color('none') # 不显示右边边框
ax.spines['top'].set_color('none') # 不显示上边边框
ax.xaxis.set_ticks_position('bottom') # 设置下边边框为x轴的位置
ax.yaxis.set_ticks_position('left') # 设置左边边框为y轴的位置
ax.spines['bottom'].set_position(('data',0)) # 设置下边边框(x轴)在y轴的-1处
ax.spines['left'].set_position(('data',0)) # 设置左边边框(y轴)在x轴的0处
# 设置x y坐标轴的数字的显示格式
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(12) # 设置数字大小
# 设置一个方框把数字给框住,facecolor是方框颜色,edgecolor是边缘颜色,alpha是透明度
label.set_bbox(dict(facecolor='red',edgecolor='None',alpha=0.7))
plt.show()
scatter散点图
import matplotlib.pyplot as plt
import numpy as np
n = 1024
X = np.random.normal(0,1,n)
Y = np.random.normal(0,1,n)
T = np.arctan2(Y,X) # for color value
plt.scatter(X,Y,s=75,c=T,alpha=0.7)
plt.xlim(-1.5,1.5)
plt.ylim(-1.5,1.5)
plt.xticks(()) # ()代表不显示xticks
plt.yticks(())
plt.show()
柱状图
import matplotlib.pyplot as plt
import numpy as np
n = 12
X = np.arange(12)
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='blue',edgecolor='white')
plt.bar(X,-Y2,facecolor='orange',edgecolor='white')
plt.ylim(-1.2,1.2)
# 在每个bar上加上y轴的值
for x,y in zip(X,Y1):
# ha: horizontal alignment
plt.text(x+0.04,y+0.05,'%.2f'%y,ha='center',va='bottom')
for x,y in zip(X,Y2):
# ha: horizontal alignment
plt.text(x+0.04,-y-0.05,'-%.2f'%y,ha='center',va='top')
plt.show()
Contours等高线图
import matplotlib.pyplot as plt
import numpy as np
def f(x,y):
# the height function
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X,Y = np.meshgrid(x,y)
# 使用plt.contourf来填充轮廓
plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)
# 使用plt.contour来添加轮廓线
C = plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)
# 添加label,clable是指contour label
plt.clabel(C,inline=True,fontsize=10)
plt.xticks(())
plt.yticks(())
plt.show()
Image图片
import matplotlib.pyplot as plt
import numpy as np
# img data
a = np.random.rand(3,3)
# upper是指将上边作为原点,也就是数组a的第一个数在图的上边
plt.imshow(a,interpolation='nearest',cmap='bone',origin='upper')
plt.colorbar(shrink=0.9) # 颜色条显示为图大小的0.9
plt.xticks(())
plt.yticks(())
plt.show()
3D数据
import matplotlib.pyplot as plt
import numpy as np
# 导入3D绘图库
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig) # 将坐标轴转化为3D坐标轴
x = 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 value
Z = np.sin(R)
# rstride是行的步长,cstride是列的步长,这里不是坐标轴的步长,而是对应在颜色空间的步长
# 步长越大,颜色块越少
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
# zdir是3D图的一个投射方向,'z'是指投射在xy平面
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')
ax.set_zlim(-2,2)
plt.show()
subplot多个显示
import numpy as np
plt.figure()
plt.subplot(2,2,1)
plt.plot([0,1],[0,1]) # 画线,如果plt.scatter,就是两个点
plt.subplot(2,2,2)
plt.plot([0,1],[0,1])
plt.subplot(2,2,3)
plt.plot([0,1],[0,1])
plt.subplot(2,2,4)
plt.plot([0,1],[0,1])
plt.show()
import numpy as np
plt.figure()
plt.subplot(2,1,1) # 第一个图占满一列
plt.plot([0,1],[0,1]) # 画线,如果plt.scatter,就是两个点
plt.subplot(2,3,4)
plt.plot([0,1],[0,1])
plt.subplot(2,3,5)
plt.plot([0,1],[0,1])
plt.subplot(2,3,6)
plt.plot([0,1],[0,1])
plt.show()
subplot分格显示
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
# method 1: subplot2grid
plt.figure()
# colspan是列的数量,rowspan是行的数量,默认是1
ax1 = plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)
ax1.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),)
ax5 = plt.subplot2grid((3,3),(2,1),)
# method 2: gridspec
plt.figure()
gs = gridspec.GridSpec(3,3)
ax1 = plt.subplot(gs[0,:])
ax2 = plt.subplot(gs[1,:2])
ax3 = plt.subplot(gs[1:,2])
ax4 = plt.subplot(gs[-1,0])
ax5 = plt.subplot(gs[-1,-2])
# method 3: easy to define structure
# sharex, sharey是判断子图是否共享x轴和y轴
f, ((ax11,ax12),(ax21,ax22)) = plt.subplots(2,2,sharex=True,sharey=True)
ax11.scatter([1,2],[1,2])
plt.tight_layout() # 让子图之间的距离更加紧致
plt.show()
次坐标轴
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0,10,0.1)
y1 = 0.05*x**2
y2 = -1*y1
fig, ax1 = plt.subplots()
ax2 = ax1.twinx() # 共享x轴,y轴镜像到右边
ax1.plot(x,y1,'g-') # -是实线
ax2.plot(x,y2,'b--')
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1',color='g')
ax2.set_ylabel('Y2',color='b')
plt.show()
Animation动画
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation
fig, ax = plt.subplots()
x = np.arange(0,2*np.pi,0.01)
line, = ax.plot(x,np.sin(x)) # 因为ax.plot返回的是一个列表,所以加逗号是为了取第一个元素
def annimate(i):
line.set_ydata(np.sin(x+i/10))
return line,
def init():
line.set_ydata(np.sin(x))
return line,
# interval是频率,这里表示每20ms更新一次
# blit判断是否更新整张图片的点,其实看起来没什么区别
# func是每一帧更新的曲线
# init是第一帧的曲线
ani = animation.FuncAnimation(fig=fig,func=annimate,frames=100,init_func=init,interval=20,blit=False)
# ani.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264']) # 报错,这是因为mp4文件需要安装ffmepg软件来支持
plt.show()
这里没有显示动画,因为我没有保存为动画格式。
补充