matplotlib 基础|笔记
先推个视频
https://www.bilibili.com/video/BV1Jx411L7LU?
这个视频我觉得作为入门挺好|基础的都讲得很全
画图前先加这两句话
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
p0:折线图
plt.plot(x,y,label)
如果x,y是一个点则和散点图没什么区别
但x,y是list则会线把所有点画出来再自动连成线(我的理解)
p4:创建画布
#创建第num个画布,名称为num facecolor 是背景颜色,edgecolor 是边的颜色 plt.figure(num=1,facecolor,edgecolor)
返回一个figure类型
p6:设置坐标轴|label
plt.xlim(5,15) plt.ylim(5,15) # 关闭坐标轴 plt.axis('off') # 关闭坐标轴之后标签也不会显示 (鸡肋?) # 修改x,y的标签 plt.xlabel(string) plt.ylabel(string)
但是plt.title(xxx)会显示
p7:Legend
这个是可以标注每条线的名称具体像这样:
# 这里用直线图举例直线图 # linestyle 可以设置线的形式比如细点画线等等,linewidth是线的粗细 l1,=plt.plot(x,y,color='red',linewidth=1,linestyle=':') l2,=plt.plot(x,y2) #将x轴的坐标改成自己想显示的坐标 $...$ 可以变斜体
plt.xticks([10,20,30,40],[r'$asdf$',r'$asdfg$',r'qerqr']) #在图旁显示线的名称,之前要声明l1,=plt... 逗号不能省,loc=best 代表自动寻找最好的地方显示 plt.legend(handles=[l1,],labels=['loss'],loc='best')
也可以这样(似乎更简单...
plt.bar(x,y,label='string%.2f'% xx)
plt.legend()
a=plt.set_text(x,y,string)|text(string) 也可以设置文本(string)和文本位置 (x,y)|可省略
a.set_posititon(x,y) 还可以单独设置文本位置
p10也有实例
p10:散点图(scatter)
#s是size,alpha 是透明度 c是color |这个color设置很迷
C=np.arctan2(y1 ,x)
plt.scatter(x,y,s=3,c=C,alpha=0.6)
p11:柱状图
# 柱状图 facecolor 柱状图颜色|这个代码可以百度上找 edgecolor 边框颜色 plt.bar(x,y,facecolor='#9999ff',edgecolor='white') plt.bar(x,-y,facecolor='#ff9999',edgecolor='white')
#取出每对x,y 在柱状图上标记text for (x,y) in zip(x,y): # 文本的坐标 x,y, 文字, 横向对齐方式的位置|居中,纵向对齐的方式| 顶部或底部 默认bottom # alpha 文本是透明度 plt.text(x,y+0.04,'%.2f'%y ,ha='center',va='bottom',alpha=0.6) plt.text(x,-y-0.04,'%.2f'%-y,ha='center',va='top')
plt.barh(x=y,y=x) 是做横向柱状图,参数都差不多,就是x和y要反过来才是你想要的结果
可以看作把x,y互换的柱状图图
p12:等高线图
# 等高线:底图其实是个网格,然后根据这个网格画等高线 # 将x,y绑定成一个网格 (X,Y)=np.meshgrid(x,y) z=X**2+Y**2+np.random.normal(0,1) # 填充颜色,contour +fillcolor ==>contourf # x,y,是坐标 数字代表有数字+1条线<==>数字+2个颜色,z是高度,cmap是每个高度对应在cmap中的颜色 有hot和cool两种 plt.contourf(X,Y ,z,1,cmap='hot') # 画等高线,linewidth不知道为什么报错 line=plt.contour(x,y,z,colors='black',linewidths=0.5) # 加label contour+label==>clabel? # inline 代表是否在线里面写字,一般为True 更好看 fontsize 字体大小 plt.clabel(line,inline=True,fontsize=8)
p13:image 图片
这个没什么好说的,就是把一个二维数组打印出来而已
plt.imshow(x)
plt.colorbar() 可以将像素的rgb值从高到低排列放到一个柱状图中
p14:3D图
from mpl_toolkits.mplot3d import Axes3D #创建画布 fig=plt.figure() x=np.linspace(-15,15,30) # 创建一个空子图 ax=Axes3D(fig) y=x #将x,y绑定成网格 就和等高线类似 x,y=np.meshgrid(x,y) z=x**2+y**2 # 画表面 x,y,z,cmap图的颜色,edgecolor 线条颜色, ax.plot_surface(x,y,z,cmap=plt.get_cmap('rainbow'),edgecolor='black') # 画投影平面 # zdir=x 是从x轴往下看==> 投影到其他两个轴围成的平面|默认是z ax.contourf(x,y,z,zdir='z')
p15+16:subplot
有两种subplot(说的不太清楚,请意会吧) 感觉本质没有什么差别
在一个网格上画多次,然后合并在一起显示
# 一个画布分为几行行,几列,当前画在第几个 # 先分3*3 在第7个位置画图|相当于第三行第一个 plt.subplot(3,3,7) plt.plot([0,1],[0,1]) #再分3*1 再第二个位置画图|相当于第二行第一个 一整块 plt.subplot(3,1,2) plt.plot([0,1],[0,1]) plt.show()
在一个画布上画一个网格,分格子显示
subplot2grid
# 网格的shape,loc 图的起点, 所占行,所占列 f1=plt.subplot2grid((3,3),(0,0),rowspan=2,colspan=2) (X,Y)=np.meshgrid(x,y) z=X**2+Y**2+np.random.normal(0,1) plt.contourf(X,Y ,z,1,cmap='hot') line=f1.contour(x,y,z,colors='black',linewidths=0.5) plt.clabel(line,inline=True,fontsize=8)
f2=plt.subplot2grid(shape,loc,rowspan,colspan)
f2.scatter()
...
plt.show()
但是这里面设置label等东西从 plt.label ==> f1.set_xlabel (什么都多加了个set)
gridspec
这个是先画出网格在分配网格(虽说都差不多...)
不过就把之前的subplot 的分配位置换成了索引的方式
from matplotlib import gridspec
gs=gridspec.GridSpec(4,4) 输入网格的行列数 (4*4)
f1=plt.subplot(gs[0,1:3]) plt.plot(x,y) plt.show()
3.subplots
这个应该也是属于subplot里面的
看源码可知返回的是一个元组,第一个是画布,第二个是空子图
figure,axs=plt.subplots(n,m) n*m的图默认1*1
axs[i][j]来指定第几个子图画
如axs[i][j].plot(...)
因为只会单纯的出现n*m个子图,不能出现1*3这样的所以后面
可以用gridspec而达到这种效果 叠加(可以理解为后画的覆盖了前面的子图
p19:Animation
# 更新的函数,传入的是frame,如果frame是为一个列表的话,更新函数调用时传入的值会是相应索引下的元素,此时动画终点就是取完列表元素
# 如果不指定frames
则会一直传入帧序号保持下去。 # 返回你想要图上能看到的东西 因为是元组所以逗号不能漏,也可以直接打印一遍
def update(i): line.set_data(x+i,y+i) # ax_text.set_text('string')
# 或者这样更容易理解
ax.plot(x+i,y+i,label='xxxx')
ax.legend() return ax,
return line,#ax_text,
# 初始化最开始的图(似乎和line的初始化差不多?,不要也可以运行...) def init(): line.set_data(x,y)
ax.set_xlim() 这里是在子图上设置而不是line return line, if __name__=='__main__': x=np.linspace(0,2*np.pi,100) y=x # 定义画布和子图 fig,ax=plt.subplots() # 初始化子图,在子图上画线,文本 等东西 line,=ax.plot([],[],'r') #text_ax=plt.text(x=,y=,'')
ani=FuncAnimation(fig=fig,frames=100,func=update,interval=10,blit=True) plt.show()
其实还有个repeat参数...不过一般都是True...
如果动态图有的坐标没有显示改一下blit说不定就好了...
组合尝试:
我感觉我都是写的伪animation(因为实在没搞懂update函数和各种参数的意义...)
话说color就没有随机吗...非要自己设置吗???!
柱状图+animation
import tensorflow as tf import numpy as np from matplotlib import pyplot as plt import matplotlib.gridspec as gridspec from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 def update(frame): ax.cla()# 清除当前轴域 ax.barh(y,x[frame],color='#9ACD32',height=0.5) print(y) return ax,#ax_text, def init(): ax.set_xlim(100,300) return ax, if __name__=='__main__': x=np.random.randint(100,200,size=(6,6)) y=['湖北','河北','江西','陕西','内蒙','安徽'] x_data=[] fig,ax=plt.subplots() ax.barh(y,x[0],color='#9ACD32',height=0.5) ani=FuncAnimation(fig=fig,frames=6,func=update,interval=1000,blit=False) plt.show()
等高线+animation
3D+animation
因发现了pyechart 发现了新大陆,果断抛弃了matplotlib...
附上pyecharts官方文档
http://gallery.pyecharts.org/#/README
和16进制color代码
https://www.sioe.cn/yingyong/yanse-rgb-16/
要打开浏览器才能看到有点麻烦
几日后....不说了seabornnb
现在:matplotlib真香