导图社区 最强Matplotlib思维导图
根据B站莫烦的视频教程整理而来, Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
编辑于2021-06-29 20:15:47整理了力扣上面的算法题目的主要思路和代码, 此思维导图会持续更新中, 购买的朋友可通过我个人介绍中的博客加我好友, 我会持续提供更新, 也可和我一起探讨算法问题。
整理了东南大学的英语学术写作的考试重点内容, 旨在培养学生的英语学术写作能力,帮助学生在初步掌握写作技巧的基础上把学术论文写得更加规范,为毕业论文的写作及今后学术研究打下坚实基础。
根据B站莫烦的视频教程整理而来, Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
社区模板帮助中心,点此进入>>
整理了力扣上面的算法题目的主要思路和代码, 此思维导图会持续更新中, 购买的朋友可通过我个人介绍中的博客加我好友, 我会持续提供更新, 也可和我一起探讨算法问题。
整理了东南大学的英语学术写作的考试重点内容, 旨在培养学生的英语学术写作能力,帮助学生在初步掌握写作技巧的基础上把学术论文写得更加规范,为毕业论文的写作及今后学术研究打下坚实基础。
根据B站莫烦的视频教程整理而来, Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。
Matplotlib
1.简介
1.1 为什么用Matplotlib
1.Matplotlib 是一个非常强大的 Python 画图工具
2.手中有很多数据, 可是不知道该怎么呈现这些数据
1.2 Matplotlib安装
1.Linux
$ sudo apt-get install python3-matplotlib
2.MacOS
$ pip3 install matplotlib
3.Windows
1.确保你有安装 Visual Studio
2.去这个网址: https://pypi.python.org/pypi/matplotlib/ 找到一个适合你自己 python 版本的 wheel (.whl) 文件
3.用 CMD 找到这个 .whl 文件目录, 然后 pip 安装
4.如果安装不成功, 还有一种方法可以简便安装所有科学运算模块. 可以搜索一下 Anaconda python
2.基本使用
2.1 基本用法
1.导包
使用import导入模块matplotlib.pyplot,并简写成plt
2.定义数据
1.使用np.linspace定义x:范围是(-1,1);个数是50. 仿真一维数据组(x ,y)表示曲线1
x = np.linspace(-1, 1, 50) y = 2*x + 1
3.定义窗口
1.plt.figure(): 使用plt.figure定义一个图像窗口
4.画曲线
1.plt.plot(x, y): 使用plt.plot画(x ,y)曲线
5.显示图像
1.plt.show(): 使用plt.show显示图像
6.图标含义
用鼠标选中区域后,可以显示细节(当数据量比较大时)
回到初始图形
可以移动图片显示不同的位置
可以调整边框的显示
保存图片
2.2 figure图像
1.说明
figure 就是一个 单独的 figure 小窗口, 小窗口里面还可以有更多的小图片
2.定义具体窗口
1.使用plt.figure定义一个图像窗口:编号为3;大小为(8, 5)
plt.figure(num=3, figsize=(8, 5))
3.画曲线
1.使用plt.plot画(x ,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
2.3 设置坐标轴
1.设置坐标轴范围
1.plt.xlim((-1, 2))
使用plt.xlim设置x坐标轴范围:(-1, 2)
2.plt.ylim((-2, 3))
使用plt.ylim设置y坐标轴范围:(-2, 3)
2.设置坐标轴名称
1.plt.xlabel('I am x')
使用plt.xlabel设置x坐标轴名称:'I am x'
2.plt.ylabel('I am y')
使用plt.ylabel设置y坐标轴名称:'I am y'
3.设置坐标轴刻度
new_ticks = np.linspace(-1, 2, 5) print(new_ticks) plt.xticks(new_ticks)
使用np.linspace定义范围以及个数:范围是(-1,2);个数是5. 使用print打印出新定义的范围. 使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5
plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) plt.show()
使用plt.yticks设置y轴刻度以及名称:刻度为[-2, -1.8, -1, 1.22, 3]; 对应刻度的名称为['really bad','bad','normal','good', 'really good']. 使用plt.show显示图像
使用$符号可以转换成其他字体,$符号中必须用转义符\才能显示出空格, r代表是正则表达式 用$alpha可以转换出α
4.隐藏坐标轴
plt.xticks(())
plt.yticks(())
2.4 转为十字坐标轴
1.设置边框颜色消失
1.获取当前坐标轴信息
1.ax = plt.gca()
(get current axis)
2.设置边框颜色
1.ax.spines['right'].set_color('none')
右侧边框;使用.set_color设置边框颜色:默认白色
2.ax.spines['top'].set_color('none')
上边框;使用.set_color设置边框颜色:默认白色
2.调整坐标轴
1.ax.xaxis.set_ticks_position('bottom')
1.设置x坐标刻度数字或名称的位置:bottom
2.所有位置:top,bottom,both,default,none
2.ax.spines['bottom'].set_position(('data', 0))
1.使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置
2.位置所有属性:outward,axes,data
3.ax.yaxis.set_ticks_position('left')
1.设置y坐标刻度数字或名称的位置:left
2.所有位置:left,right,both,default,none
4.ax.spines['left'].set_position(('data',0))
1.使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置
2.位置所有属性:outward,axes,data
2.5 Legend图例
1.添加图例
1.说明
legend 图例就是为了帮我们展示出每个数据对应的图像名称. 更好的让读者认识到你的数据结构
2.设置两条线类型
l1, = plt.plot(x, y1, label='linear line') l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
l1, l2,要以逗号结尾, 因为plt.plot() 返回的是一个列表
3.添加图例
1.legend将要显示的信息来自于上面代码中的 label
2.plt.legend(loc='upper right')
图例将添加在图中的右上角
2.调整位置和名称
1.plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='best')
2.其中'loc'参数有多种,'best'表示自动分配最佳位置,其余的如下:
'best' : 0, '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,
2.6 Annotation标注
1.plt 里面的 annotate
1.画出一条垂直于x轴的虚线
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
k表示黑色,--为虚线
2.对(x0, y0)这个点进行标注
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"))
xycoords='data' 是说基于数据的值来选位置, xytext=(+30, -30) 和 textcoords='offset points' 对于标注位置的描述 和 xy 偏差值, arrowprops是对图中箭头类型的一些设置
2.plt 里面的 text
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$', fontdict={'size': 16, 'color': 'r'})
其中-3.7, 3,是选取text的位置, 空格需要用到转字符\,fontdict设置文本字体
2.7 tick 能见度
1.说明
当图片中的内容较多,相互遮盖时,我们可以通过设置相关内容的透明度来使图片更易于观察
2.调整坐标
1.x轴和y轴的刻度 数字进行透明度设置
for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(12) # 在 plt 2.0.2 或更高的版本中, 设置 zorder 给 plot 在 z 轴方向排序 label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.7, zorder=2)) plt.show()
label.set_fontsize(12)重新调节字体大小, bbox设置目的内容的透明度相关参数,facecolor调节 box 前景色, edgecolor 设置边框, 本处设置边框为无,alpha设置透明度
3.画图种类
3.1 Scatter 散点图
1.生成数据
n = 1024 # data size X = np.random.normal(0, 1, n) # 每一个点的X值 Y = np.random.normal(0, 1, n) # 每一个点的Y值
生成1024个呈标准正态分布的二维数据组 (平均数是0,方差为1) 作为一个数据集
T = np.arctan2(Y,X) # for color value
图像化这个数据集。每一个点的颜色值用T来表示
2.图像化
plt.scatter(X, Y, s=75, c=T, alpha=.5)
输入X和Y作为location,size=75,颜色为T,color map用默认值,透明度alpha 为 50%
3.2 Bar柱状图
1.生成基本图形
plt.bar(X, +Y1)
2.加颜色
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
用facecolor设置主体颜色,edgecolor设置边框颜色为白色
3.加数据
for x, y in zip(X, Y1): #不用zip每次只会输出一个数值 # ha: horizontal alignment # va: vertical alignment plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')
用函数plt.text分别在柱体上方(下方)加上数值, 用%.2f保留两位小数,横向居中对齐ha='center', 纵向底部(顶部)对齐va='bottom'
3.3 Contours等高线图
1.生成数据
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)
数据集即三维点 (x,y) 和对应的高度值,共有256个点。 高度值使用一个 height function f(x,y) 生成。 x, y 分别是在区间 [-3,3] 中均匀分布的256个值, 并用meshgrid在二维平面中将每一个x和每一个y分别对应起来,编织成栅格
2.颜色填充
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
位置参数分别为:X, Y, f(X,Y)。透明度0.75, 并将 f(X,Y) 的值对应到color map的暖色组中寻找对应颜色
3.画等高线
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
位置参数为:X, Y, f(X,Y)。颜色选黑色,线条宽度选0.5 8代表等高线的密集程度,这里被分为10个部分。如果是0,则图像被一分为二
4.添加高度数字
plt.clabel(C, inline=True, fontsize=10)
inline控制是否将Label画在线里面,字体大小为10
3.4 Image图片
1.随机矩阵画图
1.打印出的是纯粹的数字,而非自然图像。 用3x3的2D-array来表示点的颜色,每一个点就是一个pixel
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
之前选cmap的参数时用的是:cmap=plt.cmap.bone,而现在,可以直接用单引号传入参数。 origin='lower'代表的就是选择的原点的位置,origin='upper'的图像会和数字完全对应
2.出图方式
3.colorbar
plt.colorbar(shrink=.92)
添加一个colorbar,添加一个shrink参数,使colorbar的长度变短为原来的92%
3.5 3D 数据
1. 3D 图
1.导包
进行 3D Plot 时除了导入 matplotlib ,还要额外添加一个模块,即 Axes3D 3D 坐标轴显示
from mpl_toolkits.mplot3d import Axes3D
2.添加3D坐标轴
fig = plt.figure() ax = Axes3D(fig)
3.添加数据
X = np.arange(-4, 4, 0.25) Y = np.arange(-4, 4, 0.25) X, Y = np.meshgrid(X, Y) # x-y 平面的网格 R = np.sqrt(X ** 2 + Y ** 2) # height value Z = np.sin(R)
给进 X 和 Y 值,并将 X 和 Y 编织成栅格。 每一个(X, Y)点对应的高度值用下面这个函数来计算
4.填充颜色
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
rstride 和 cstride 分别代表 row 和 column 的跨度
2.投影
1.添加 XY 平面的等高线
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))
如果 zdir 选择了x,那么效果将会是对于 XZ 平面的投影,offset偏移到什么位置
4.多图合并
4.1 Subplot多合—显示
1.均匀图中图
1.分割窗口
plt.subplot(2,2,1)
将整个图像窗口分为2行2列, 当前位置为1
2.创建小图
plt.subplot(2,2,1) plt.plot([0,1],[0,1])
在第1个位置创建一个小图
plt.subplot(2,2,2) plt.plot([0,1],[0,2])
在第2个位置创建一个小图
2.不均匀图中图
1.分割窗口
plt.subplot(2,1,1)
将整个图像窗口分为2行1列, 当前位置为1
2.创建小图
plt.subplot(2,1,1) plt.plot([0,1],[0,1])
在第1个位置创建一个小图
plt.subplot(2,3,4) plt.plot([0,1],[0,2])
在第4个位置创建一个小图
为什么第4个位置放第2个小图. 上一步中使用plt.subplot(2,1,1)将整个图像窗口分为2行1列, 第1个小图占用了第1个位置, 也就是整个第1行. 这一步中使用plt.subplot(2,3,4)将整个图像窗口分为2行3列, 于是整个图像窗口的第1行就变成了3列, 也就是成了3个位置, 于是第2行的第1个位置是整个图像窗口的第4个位置
4.2 Subplot分格显示
1.subplot2grid
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3) ax1.plot([1, 2], [1, 2]) # 画小图 ax1.set_title('ax1_title') # 设置小图的标题 ax1.set_xlabel('ax1_x') # 对x轴命名 ax1.set_ylabel('ax1_y')
创建第1个小图, (3,3)表示将整个图像窗口分成3行3列, (0,0)表示从第0行第0列开始作图,colspan=3表示列的跨度为3, rowspan=1表示行的跨度为1. colspan和rowspan缺省, 默认跨度为1
2.gridspec
1.导包
import matplotlib.gridspec as gridspec
2.分割窗口
gs = gridspec.GridSpec(3, 3)
将整个图像窗口分成3行3列
3.作图
ax6 = 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])
gs[0, :]表示这个图占第0行和所有列, gs[1, :2]表示这个图占第1行和第2列前的所有列, gs[1:, 2]表示这个图占第1行后的所有行和第2列, gs[-1, 0]表示这个图占倒数第1行和第0列, gs[-1, -2]表示这个图占倒数第1行和倒数第2列
3.subplots
f, ((ax11, ax12), (ax13, ax14)) = plt.subplots(2, 2, sharex=True, sharey=True)
f表示传出来的窗口参数, 想更改窗口的参数都通过f修改 建立一个2行2列的图像窗口,sharex=True表示共享x轴坐标, sharey=True表示共享y轴坐标. ((ax11, ax12), (ax13, ax14))表示第1行从左至右依次放ax11和ax12, 第2行从左至右依次放ax13和ax14
4.3 图中图
1.确定大图位置
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8 ax1 = fig.add_axes([left, bottom, width, height]) ax1.plot(x, y, 'r')
确定大图左下角的位置以及宽高 4个值都是占整个figure坐标系的百分比 将大图坐标系添加到figure中,颜色为r(red)
2.确定小图位置
left, bottom, width, height = 0.2, 0.6, 0.25, 0.25 ax2 = fig.add_axes([left, bottom, width, height]) ax2.plot(y, x, 'b')
注意坐标系位置和大小的改变
plt.axes([0.6, 0.2, 0.25, 0.25]) plt.plot(y[::-1], x, 'g') # 注意对y进行了逆序处理
直接往plt里添加新的坐标系
4.4 次坐标轴
1.获取figure默认的坐标系 ax1
fig, ax1 = plt.subplots()
2.对ax1调用twinx()方法,生成如同镜面效果后的ax2
ax2 = ax1.twinx()
5.动画
5.1 Animation 动画
1.定义函数
1.导包
from matplotlib import animation
2.数据: 0~2π内的正弦曲线
x = np.arange(0, 2*np.pi, 0.01) line, = ax.plot(x, np.sin(x))
3.构造自定义动画函数animate
def animate(i): line.set_ydata(np.sin(x + i/10.0)) return line,
用来更新每一帧上各个x对应的y坐标值,参数表示第i帧,返回列表
4.构造开始帧函数init
def init(): line.set_ydata(np.sin(x)) return line,
2.参数设置
ani = animation.FuncAnimation(fig=fig, func=animate, frames=100, init_func=init, interval=20, blit=False)
1. fig 进行动画绘制的figure 2. func 自定义动画函数,即传入刚定义的函数animate 3. frames 动画长度,一次循环包含的帧数 4. init_func 自定义开始帧,即传入刚定义的函数init 5. interval 更新频率,以ms计 6. blit 选择更新所有点/更新产生变化的点。应选择True,但mac用户请选择False
3.保存动画
ani.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
将动画以mp4格式保存下来,但首先要保证你已经安装了ffmpeg 或者mencoder