【Matplotlib-1】 matplotlib绘图的组成元素
https://zhuanlan.zhihu.com/p/231994155
figure——窗口(画布)
plt.figure(figsize=(12, 6), dpi=100, facecolor="white") ##大小、分辨率、颜色
figure 的重复利用能大大节约时间,但是 matplotlib 维护的 figure 有数量上限。并且,不断的创建新的 figure 实例,很容易造成内存泄漏,而应合理的复用,能大大的提高运行速度。
此外,在某些情况下,不清理 figure 将有可能造成在第一幅中 plot 的线再次出现在第二幅图中。
plt.cla() # 清除axes,即当前 figure 中的活动的axes,但其他axes保持不变。 plt.clf() # 清除当前 figure 的所有axes,但是不关闭这个 window,所以能继续复用于其他的 plot。 plt.close() # 关闭 window,如果没有指定,则指当前 window。 plt.close('all') #关闭所有 figure windows
Axes——图形(所有图形元素都是Axes的实例)
title——标题
xlabel——横轴标签
ylabel——纵轴标签
xlim——横轴范围
plt.xlim(xmin, xmax)
ylim——纵轴范围
坐标轴范围还可用axis设定
plt.axis(xmin, xmax, ymin, ymax)
plot——曲线
plt.plot(x,y,ls="-.",lw=2,c="c",label="plot figure")
ls——线型
lw——线宽
c——颜色
label——该曲线的标签(显示在legend中),若在legend中指定了labels,该label会被覆盖。
import matplotlib.pyplot as plt a = np.linspace(0, 2 * np.pi, 50) b = np.sin(a) plt.plot(a,b) mask = b >= 0 plt.plot(a[mask], b[mask], 'bo') ## 绘制满足条件mask的图 mask = (b >= 0) & (a <= np.pi / 2) plt.plot(a[mask], b[mask], 'go') plt.show()
legend——图例
先plot()后legend()
plt.legend(wedges, labels, loc = 'best', bbox_to_anchor = (num1, num2, num3, num4), ncol = 2, title = '图例标题', edgecolor = 'black', facecolor = 'pink', shadow = True, fancybox = True)
wedges——饼片实例列表。就可以将饼片外部的文本标签放在图例中,而饼片的数值标签仍然放在饼片内部
labels——文本标签。若缺省则显示pie等绘图函数中的labels,优先级大于plot中的label。
可用matplotlib自带TeX功能实现对数学表达式的编辑
plt.legend(x, y, label = r'$sin(x)$') ## r表示使用TeX解析字符串 ## 两个$$之间的字符串将以斜体输出 loc——图例大概位置
String Number 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 bbox_to_anchor——微调图例位置
bbox_to_anchor——是一个四元元组,且使用Axes坐标系统。也就是说,第1个元素代表距离画布左侧的x轴长度的倍数的距离;第2个元素代表距离画布底部的y轴长度的倍数的距离;第3个元素代表x轴长度的倍数的线框长度;第4个元素代表y轴长度的倍数的线框宽度。
ncol——设定图例条目的列数
title——图例的标题
edgecolor——图例边框颜色
facecolor——图例填充颜色
grid——网格线
plt.grid(True, which = 'major', axis = 'both',ls = ':', lw = 1, c = 'y')
True/None——设置是否显示网格。设置None时若给了其他参数,则None失效
which——'major'显示主刻度线,'minor'显示次刻度线
axis——以哪个坐标轴的刻度生成网格
marker——(标记)点的形状
plt.plot(x, y, color='r', marker='o', linestyle='dashed') ## 点形状为圆圈标记circle marker
ax[0,0].scatter(x,y*1.5,marker=r"$\clubsuit$",c="#fb8072",s=500) ax[0,1].scatter(x,y-2,marker=r"$\heartsuit$",s=500) ax[1,0].scatter(x,y+7,marker=r"$\diamondsuit$",s=500) ax[1,1].scatter(x,y-9,marker=r"$\spadesuit$",c="#8dd3c7",s=500)
text——注释文本
在图形的指定位置添加文本,用于对图形进行说明
plt.text(2.8, 0.3, s= 'sin(x)', weight = 'bold', color = 'blue')
annotate——箭头指向+注释文本
from pylab import * plt.annotate(text ="(0,1)", xy = (0,1), xytext = (1,1.5), weight = 'bold', color = 'red', arrowprops = dict(arrowstyle = '-|>', color = 'black', connectionstyle = 'arc3, rad = 0.5'), bbox=dict(boxstyle='round,pad=0.5', facecolor='yellow', edgecolor='k', lw=1, alpha=0.4))
xy——箭头起点坐标
xytext——文本坐标
annotate中最重要的控制,全部由arrowprops这个变量完成,它是一个字典类型,可以控制箭头的诸多属性
bbox——text的bbox属性,注释文本的外框
connectionstyle——弯曲箭头arc3、angle3
connectionstyle = 'arc3, rad = 0.5'
connectionstyle = 'angle3, angleA=-90,angleB=0'
axhline——水平参考线
Axes.axhline(y=0, xmin=0, xmax=1, color='green' , linestyle='--') ##省略xmin和xmax时为横穿整个坐标轴的线
axvline——竖直参考线
Axes.axvline(x=0, ymin=0, ymax=1, color='green' , linestyle='--') ##省略ymin和ymax时为横穿整个坐标轴的线
axhspan——水平矩形区域
color不能省略为c
axhspan(xmin = 0.0, xmax = 1.0, ymin, ymax, color, alpha) ##水平矩形的ymin和ymax不能缺省。x缺省时矩形横穿整个坐标轴
axvspan——竖直矩形区域
axvspan(xmin, xmax, ymin, ymax, color, alpha) ##竖直矩形的xmin和xmax不能缺省
颜色代码
填充区域
fill
和plot功能类似,可绘图
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 5 * np.pi, 1000) y1 = np.sin(x) y2 = np.sin(2 * x) plt.fill(x, y1, color = 'darkorange', alpha = 0.4, label="$ y = sin(x) $") plt.fill(x, y2, color = 'violet', alpha = 0.4, label="$ y = sin(2x) $") plt.legend(loc='best') plt.show()
fill_between
作用是填充两条水平曲线y=f(x)
之间的区域
简单的填充所围区域:x规定横轴范围,y1和y2之间所围。
plt.fill_between(x, y1, y2 = 0, where = None)
x——横轴范围,必须参数
y1、y2——两条水平曲线。可以是数值,数值就是一条水平线
where——条件,去掉一些区域
x = np.linspace(-2*np.pi, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot((x.min(), x.max()), (0, 0)) ## 绘制x=0水平线 plt.plot(x, y1, color = 'blue', label = '$sin(x)$') plt.plot(x ,y2, color = 'red', label = '$cos(x)$') # plt.fill_between(x, y2, y1, where = (x>0)&(x<np.pi/2), color = 'darkorange', alpha = 0.4) plt.fill_between(x, y1, y2, where = (y1<y2), color = 'violet', alpha = 0.4) plt.legend(loc = 'best') plt.show()
x = np.linspace(-2*np.pi, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot((x.min(), x.max()), (0, 0)) plt.plot(x, y1, color = 'blue', label = '$sin(x)$') plt.plot(x ,y2, color = 'red', label = '$cos(x)$') plt.fill_between(x, y2, y1, where = (x>0)&(x<np.pi/2), color = 'darkorange', alpha = 0.4) # plt.fill_between(x, y1, y2, where = (y1<y2), color = 'violet', alpha = 0.4) plt.legend(loc = 'best') plt.show()
x = np.linspace(-2*np.pi, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot((x.min(), x.max()), (0, 0)) plt.plot(x, y1, color = 'blue', label = '$sin(x)$') plt.plot(x ,y2, color = 'red', label = '$cos(x)$') # plt.fill_between(x, y2, y1, where = (x>0)&(x<np.pi/2), color = 'darkorange', alpha = 0.4) # plt.fill_between(x, y1, y2, where = (y1<y2), color = 'violet', alpha = 0.4) plt.fill_between(x, y1, 0, where = (x>0)&(x<2*np.pi), color = 'violet', alpha = 0.5) plt.legend(loc = 'best') plt.show()
x = np.linspace(-2*np.pi, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot((x.min(), x.max()), (0, 0)) plt.plot(x, y1, color = 'blue', label = '$sin(x)$') plt.plot(x ,y2, color = 'red', label = '$cos(x)$') # plt.fill_between(x, y2, y1, where = (x>0)&(x<np.pi/2), color = 'darkorange', alpha = 0.4) # plt.fill_between(x, y1, y2, where = (y1<y2), color = 'violet', alpha = 0.4) plt.fill_between(x, y1, 0.5, where = (x>0)&(x<np.pi), color = 'violet', alpha = 0.5) plt.legend(loc = 'best') plt.show()
x = np.linspace(-2*np.pi, 2*np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot((x.min(), x.max()), (0, 0)) plt.plot(x, y1, color = 'blue', label = '$sin(x)$') plt.plot(x ,y2, color = 'red', label = '$cos(x)$') # plt.fill_between(x, y2, y1, where = (x>0)&(x<np.pi/2), color = 'darkorange', alpha = 0.4) # plt.fill_between(x, y1, y2, where = (y1<y2), color = 'violet', alpha = 0.4) plt.fill_between(x, y1, 0.5, where = (y1>0.5)&(x>0)&(x<np.pi), color = 'violet', alpha = 0.5) plt.legend(loc = 'best') plt.show()
fill_betweenx
填充两条垂直曲线x=f(y)
之间的区域
import matplotlib.pyplot as plt import numpy as np y = np.arange(0.0, 2, 0.01) x1 = np.sin(2 * np.pi * y) x2 = 1.2 * np.sin(4 * np.pi * y) fig, [ax1, ax2, ax3] = plt.subplots(1, 3, sharey=True, figsize=(6, 6)) ax1.fill_betweenx(y, 0, x1) ax1.set_title('between (x1, 0)') ax2.fill_betweenx(y, x1, 1) ax2.set_title('between (x1, 1)') ax2.set_xlabel('x') ax3.fill_betweenx(y, x1, x2) ax3.set_title('between (x1, x2)')
基本plot流程
## plot x = np.linspace(-10, 10, 100) ##[-10,10]分成100份 siny = np.sin(x) cosy = np.cos(x) plt.figure(figsize = (12, 6), dpi = 100, facecolor = 'white') ##设置画布:尺寸12*6,分辨率100 plt.title('sinx/cosx') plt.xlabel('x') plt.ylabel('y') # plt.xlim(-2*np.pi, 2*np.pi) plt.axis([-10, 10, -2, 2]) ## 坐标轴范围 plt.plot(x, siny, ls = '-', lw = 2, c = 'blue', label = 'sin(x)') ## 绘制曲线 plt.plot(x, cosy, ls = '-', lw = 2, c = 'green', label = 'cos(x)') plt.legend(loc = 'upper right') ## 图例位置 plt.grid(True, axis = 'both',ls = ':', c = 'y') ## 网格 plt.axhline(y = 1.0, ls = '--', lw = 2, c = 'r') ## y=1.0位置水平线 plt.axhline(y = -1.0, ls = '--', lw = 2, c = 'r') ## y=-1.0位置水平线 plt.axvspan(xmin = 0.0, xmax = np.pi/2, color = 'grey', alpha = 0.4) ## [0.0, pi/2]竖直矩形 plt.text(1.3, 0.3, s= 'cos(x)', weight = 'bold', color = 'green') ## (1.3,0.3)位置文本cos(x) plt.text(2.8, 0.3, s= 'sin(x)', weight = 'bold', color = 'blue') plt.annotate(text ="(0,1)", xy = (0,1), xytext = (1,1.5), weight = 'bold', color = 'red', arrowprops = dict(arrowstyle = '-|>', color = 'black',connectionstyle = 'arc3,rad = 0.5')) ## 箭头文本 plt.show()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)