引言:matplotlib是python很方便的一个绘图库,可以绘制比如线状、柱状、折线、2D、3D等图片。
目录
一、 基本功能
二、图像解释
2.1 legend图例
2.2 annotation标注
三、图像绘制
3.1 scatter散点绘制
3.2 bar柱状图
3.3 contour等高线图
3.4 Image图片
3.5 3D plot
matplotlib画图基本用法包括:基本图像的绘制、选取X Y坐标轴及设置坐标轴lebal,X Y的范围和刻度以及XY坐标轴的相对位置。
import numpy as np
import matplotlib.pyplot as plt
# 1 画一个简单图像
x = np.linspace(-1, 1, 50)
y = x
plt.plot(x, y)
# 限定x y坐标范围
plt.xlim((-0.5, 0.5))
plt.ylim((-0.5, 0.5))
# 给x 和 y 坐标轴取lebal
plt.xlabel('I am X')
plt.ylabel('I am Y')
# 给x y坐标值重新赋值
new_xticks=np.linspace(-0.5,0.5,5)
plt.xticks(new_xticks)
plt.yticks([-0.4,-0.2,0.0,0.2,0.4],
[r'$I\ am\ -0.4$',r'$I\ am\ -0.2$',r'$I\ am\ -0.0$',
r'$I\ am\ 0.2$',r'$I\ am\ 0.4$'],color='g')
# 修改坐标轴的位置 取消top和rught 设置x和y坐标轴
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 设置x y 坐标轴具体位置 eg:x轴对齐y=0.2 y轴对齐x=0.2
ax.spines['bottom'].set_position(('data',0.2))
ax.spines['left'].set_position(('data',0.2))
最终绘制的图像如下图:(若想看每一步的变化效果,建议自己试验一下)
最后,如果ticks设置特殊符号,eg:α 表示方法为\alpha, σ 表示方法为 \sigma
# 1 画一个简单图像
x = np.linspace(-1, 1, 50)
y1 = x**2
y2 = x
plt.plot(x, y1,color='g',ls='--',label='aaa')
plt.plot(x,y2,color='black',label='bbb')
# legend 图例 对图像的线条解释
plt.legend()
当然legend图例也可以定制:
l1, = plt.plot(x, y1,color='g',ls='--',label='aaa')
l2, = plt.plot(x,y2,color='black',label='bbb')
# legend 图例 对图像的线条解释
plt.legend(handles=[l1],labels=['a'])
注意plt.plot是有类型为列表的返回值的,故接受需要后加' , '这种方法适合仅标注部分线条的情况
# annotation标注
x0 = 0.5
y0 = x0
plt.scatter(x0, y0, s=50,c='b')
plt.plot([x0,x0],[y0,0],'k--',lw=1.5)
# 法一
plt.annotate('x=%s'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),
textcoords='offset points',fontsize=16,
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.3'))
# 法二
plt.text(-0.7,0.5,r'$this\ is\ x=0.5$',fontdict={'size':10,'color':'r'})
那么如果出现线条很粗,覆盖了坐标轴的刻度,我们可以采用设置tick能见度的方式让刻度显示出来。
# 设置tick能见度
for label in ax.get_xticklabels()+ax.get_yticklabels():
label.set_fontsize(12)
label.set_bbox(dict(facecolor='red',edgecolor='None',alpha=0.5))
# 1 绘制一个散点图
n = 1024
x = np.random.normal(0,1,n)
y = np.random.normal(0,1,n)
# 设置颜色和集中形状
T = np.arctan2(y,x)
plt.scatter(x,y,s=75,c=T,alpha=0.5)
方向分为向上和向下两种方式:
# 绘制bar柱状图
x = np.arange(5)
y = x/2
# 1 双向
plt.bar(x, +y)
plt.bar(x,-y,facecolor='pink')
# 2 给柱状图加数字
for x,y in zip(x,y):
plt.text(x+1,y+0.6,'%.2f'%y)
plt.text(x+1,-y-0.8,'%.2f'%y)
text()还有其他参数可以个性化定制。
# 绘制等高线图 高度函数不是唯一 视情况而定
def f(x,y):
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映射到网格上
X,Y=np.meshgrid(x,y)
# 填充颜色 划线 线上填充文字
plt.contourf(X,Y,f(X,Y),20,alpha=0.75,cmap=plt.cm.hot)
c=plt.contour(X,Y,f(X,Y),20,colors='black',lw=.5)
plt.clabel(c, inline=True,fontsize=10)
# 绘制image图片 很像色板
x= np.arange(9).reshape((3,3))
plt.imshow(x, interpolation='nearest',cmap='bone',origin='lower')
plt.colorbar(shrink=0.8)#可设置压缩比
# 3D 图像
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax=Axes3D(fig)
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)
Z=np.cos(R)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))
ax.contourf(X,Y,Z,zdir='z',offset=-1,cmap='rainbow')
接下