当前位置: 首页 > news >正文

如何用matplotlib画图?(以灰色预测模型为例)

matplotlib绘图知识库

1.绘图核心步骤:

  • 导入库: import matplotlib.pyplot as plt
  • 准备数据:x,y轴数据
  • 画图:选择图形类型(折线图、散点图、柱状图)
  • 美化:加标题、标签、图例、网格
  • 显示:plt.show()

2.常用图形:

折线图plt.plot()数据随时间变化趋势
散点图plt.scatter()两个变量的分布关系
柱状图plt.bar()比较不同类别的数量大小

对于灰色预测模型,把折线图和散点图结合使用(折线表示趋势,散点表示数据点)

3.绘图函数:

绘图函数用途示例
plt.title()加标题plt.title('灰色预测模型')
plt.xlabel()加x轴标签plt.xlabel('年份')
plt.ylabel()加y轴标签plt.ylabel('降雨量')
plt.legend()显示图例(配合label参数)plt.legend()
plt.grid(True)显示网格plt.grid(True)
plt.figure(figsize=(宽,高))画布大小plt.figure(figsize=(10,5))

4.举个例子:

plt.plot(x,y1,'o--',color='red',label='原始数据') #绘制的图像由虚线和圆点构成,红色,标签是原始数据

plt.plot(x,y2,'s-',color='blue',label='预测数据') #绘制的图像由实线和方块组成,蓝色,标签是预测数据

plt.scatter(x,y,color='red',marker='s',s=50) #绘制的图像是红色的方块状散点图,散点大小是50


案例分析:以灰色预测模型的拟合效果图为例

导入相关库并设置显示参数:

import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore') #忽略运行时警告信息

plt.rcParams['axes.unicode_minus'] = False #修复负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']


数据处理:

x_data = [i+1 for i in range(len(lst))]
x_data2 = [i+6 for i in range(len(pre_val) - 5)]
y_data = lst
y_data2 = pre_val[5:]

其中,y_data是原始数据,y_data2是预测序列的后5个预测数据.


绘制散点折线图:

plt.plot(x_data,y_data,'o-',color = 'blue',label = '原始数据',markersize = 8)
plt.plot(x_data2,y_data2,'s--',color = 'red',label = '预测数据',markersize = 8)


绘制参考线:

考虑到可视化图像的可读性,模拟一条预测序列的虚线,让图形更易懂。

#参考线
x = [i+1 for i in range(10)]
y = pre_val
plt.plot(x,y,'--',color = 'green',label = '拟合值',markersize = 6)


设置图片参数:

plt.title('灰色预测模型')
plt.xlabel('年份')
plt.ylabel('降雨量')
plt.legend()
plt.grid(True)
plt.show()


图形展示:

灰色预测模型完整代码:

#灰色预测模型核心部分 import numpy as np import pandas as pd lst = [600,620,650,680,700] n = len(lst) #级比检验 def init_check(data): lst1 = [] for i in range(1,len(data)): a = data[i-1] / data[i] if a >= np.e**(-2/(n+1)) and a <= np.e**(2/(n+1)): lst1.append(a) else: print(f"级比{a}不在检验区间内,数据不适合直接建模") return lst1 answer = init_check(lst) #累加生成 x1 = [] for i in range(len(lst)): if i == 0: x1.append(lst[i]) else: x1.append(lst[i]+x1[i-1]) #均值生成 x2 = [] for i in range(len(x1)): if i == 0: continue else: x2.append((x1[i]+x1[i-1])/2) #求解参数 B = np.array([ [-x2[0],1], [-x2[1],1], [-x2[2],1], [-x2[3],1] ]) Y = np.array([620,650,680,700]).T result = np.linalg.inv(B.T @ B) @ B.T @ Y a = result[0] b = result[1] print("a =", a) print("b =", b) pre = [] #代入时间响应公式 for i in range(len(lst)): val = (lst[0] - b/a)*np.e**(-a*i) + b/a pre.append(val) print("累加预测序列:",pre) #累减还原 pre_val = [] for i in range(len(pre)): if i == 0: pre_val.append(pre[i]) else: val1 = pre[i] - pre[i-1] pre_val.append(val1) print("最终预测序列:",pre_val) #残差检验 def residual_check(pre_list,ini_list): residuals = [] sum = 0 for i in range(len(ini_list)): #相对残差 residual = abs(pre_list[i] - ini_list[i])/ ini_list[i] sum += residual residuals.append(residual) avg = sum / len(residuals) if avg < 0.05: print(f"残差检验{avg}优秀") elif avg < 0.10: print(f"残差检验{avg}合格") else: print("残差检验不通过") return residuals residuals = residual_check(pre_val,lst) #后验差检验 #绝对残差 abs_residuals = [lst[i] - pre_val[i] for i in range(n)] #原始数据的标准差s1 s1 = np.std(lst) s2 = np.std(abs_residuals) c = s2 / s1 if c < 0.35: print("好") elif c < 0.5: print("合格") else: print("不合格") #p值 def calcute_p(residual_list): count = 0 avg_res = np.mean(residual_list) # 残差的均值 s2 = np.std(residual_list) # 残差的标准差 lower = avg_res - 0.6745 * s1 # 区间下限 upper = avg_res + 0.6745 * s1 # 区间上限 for i in range(len(residual_list)): if lower <= residual_list[i] <= upper: # 判断是否落在区间内 count += 1 p = count / len(residual_list) if p > 0.95: print("一级") elif p > 0.80: print("二级") else: print("不合格") return p calcute_p(abs_residuals) #外推预测 pre = [] for i in range(len(lst)+5): val = (lst[0] - b/a)*np.e**(-a*i) + b/a pre.append(val) print("累加预测序列:",pre) #累减还原 pre_val = [] for i in range(len(pre)): if i == 0: pre_val.append(pre[i]) else: val1 = pre[i] - pre[i-1] pre_val.append(val1) print("最终预测序列:",pre_val) #绘制拟合效果图 import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') #忽略运行时警告信息 plt.rcParams['axes.unicode_minus'] = False #修复负号显示 plt.rcParams['font.sans-serif'] = ['SimHei'] x_data = [i+1 for i in range(len(lst))] x_data2 = [i+6 for i in range(len(pre_val) - 5)] y_data = lst y_data2 = pre_val[5:] plt.plot(x_data,y_data,'o-',color = 'blue',label = '原始数据',markersize = 8) plt.plot(x_data2,y_data2,'s--',color = 'red',label = '预测数据',markersize = 8) #参考线 x = [i+1 for i in range(10)] y = pre_val plt.plot(x,y,'--',color = 'green',label = '拟合值',markersize = 6) plt.title('灰色预测模型') plt.xlabel('年份') plt.ylabel('降雨量') plt.legend() plt.grid(True) plt.show()

注:1.计算p值要用绝对残差。2.由于绘图代码简略,绘制的图片不够美观。可根据自身喜好调整参数

http://www.jsqmd.com/news/1306885/

相关文章:

  • 嵌入式显示触控模组开发实战:MIPI DSI与触控驱动调试详解
  • PHP微服务架构下的服务发现与负载均衡实践
  • JavaScript switch-case 语句:从基础语法到高级模式与性能优化
  • C语言printf输出延迟问题与缓冲区机制解析
  • 中国信通院泰尔实验室全景图发布,悬镜安全位列软件供应链安全与AI原生安全第一梯队
  • 2026玉树黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐
  • Decodo Chrome 扩展程序完全指南:从安装到高阶配置
  • Jetson边缘计算实战:基于TensorRT优化的实时语音识别与字幕生成
  • BthPS3:Windows内核级蓝牙驱动破解PS3外设连接限制
  • 如何快速免费解锁Wand专业版功能:开源工具提供无限制体验
  • 终极文件分析指南:Detect-It-Easy如何快速识别文件类型与安全风险
  • Jetson Nano边缘AI开发实战:从硬件解析到TensorRT模型部署
  • 实力强的佛山家具行业抖音代运营推荐 - 甄选测评馆
  • 行业首份《AI-H5兼容性白皮书》发布(覆盖iOS/Android 87款机型实测数据,仅开放48小时下载)
  • 电商 AI 套图生成的一体化架构分析——从多工具拼装到单平台全链路
  • 绵阳万嘉美居口碑好吗
  • OpenClaw 部署频繁翻车?Windows/Mac 双系统完整避坑实操全解
  • 如何用Python下载B站视频:支持大会员4K超高清画质
  • Jetson Nano GPIO控制3路继电器:从硬件连接到Python编程实战
  • 树莓派3B固件包安装与维护全攻略:从定位到回滚
  • 芒市本地家装公司哪家强?金孔雀大街温馨家园装饰深度测评 - 甄选测评馆
  • 拍照搜题APP哪个出答案快、解析清楚?四款主流工具功能深度解析
  • Drain算法解析:高效日志结构化处理的核心原理与工程实践
  • 软件工程期末试题全解析:从UML建模到AI浪潮下的职业思考
  • 2026 年 8 月兴安盟非急救医疗转运行业发展解析及本土合规企业服务实录 - 平台推荐官
  • 终极指南:OpenCore Legacy Patcher如何让十年老Mac运行最新macOS
  • 萨达萨达萨达萨达
  • 74HC595驱动四位数码管:从硬件连接到软件调试的完整指南
  • 微信聊天记录永久保存指南:WeChatMsg完全本地化数据备份方案
  • UE4SS终极指南:15分钟掌握虚幻引擎游戏修改神器