用Python的matplotlib绘制残差分析散点误差棒图


前言

残差误差棒图是残差分析中必不可少的图,下面我将介绍一下我画的残差散点图
话不多说先上图:

一、数据读取

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

data = pd.read_excel('残差分析数据.xlsx', engine='openpyxl')
print(data)
A = data['A']
r_inter = data['r_inter']
r_intra = data['r_intra']

二、数据分段

根据横坐标A将残差数据分段,计算不同段的均值和标准差

1.数据分段

r_intra2 = []
r_intra3 = []
r_intra4 = []
r_intra5 = []
r_intra6 = []
r_intra7 = []
r_intra8 = []
for i in range(len(r_intra)):
    if 0<=A[i]<50:
        r_intra1.append(r_intra[i])
    elif 50<=A[i]<100:
        r_intra2.append(r_intra[i])
    elif 100 <= A[i] < 150:
        r_intra3.append(r_intra[i])
    elif 150 <=A[i] < 200:
        r_intra4.append(r_intra[i])
    elif 200 <= A[i] < 250:
        r_intra5.append(r_intra[i])
    elif 250 <= A[i] < 300:
        r_intra6.append(r_intra[i])
    elif 300 <= A[i] < 350:
        r_intra7.append(r_intra[i])
    elif 350 <= A[i] < 400:
        r_intra8.append(r_intra[i])
 

2.计算均值和标准差

def mean_std(residual):
    m = np.mean(residual)
    s = np.std(residual)
    return m, s
m1, s1 = mean_std(r_intra1)
m2, s2 = mean_std(r_intra2)
m3, s3 = mean_std(r_intra3)
m4, s4 = mean_std(r_intra4)
m5, s5 = mean_std(r_intra5)
m6, s6 = mean_std(r_intra6)
m7, s7 = mean_std(r_intra7)
m8, s8 = mean_std(r_intra8)

三、画图

fig = plt.figure(figsize=(5, 4))
plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
plt.rcParams['font.family'] = ["Times New Roman"] # 字体设置为Times NewRoman
plt.scatter(A, r_intra, c='none', edgecolors='gray', alpha=0.8) 
# 画散点图, c表示填充数据颜色,edgecolors表示散点外圈颜色, alpha表示透明度(0-1)
plt.errorbar([25, 75, 125, 175, 225, 275, 325, 375], [m1, m2, m3, m4, m5, m6, m7, m8],
             yerr=[s1, s2, s3, s4, s5, s6, s7, s8], fmt='s-', ecolor='black', color='red',
             elinewidth=2.5, capsize=5)
# 绘制数据的误差置信区间图,前三个list分别表示:误差棒的位置,均值,方差,其余参数解释见matplotlib官网在这里插入代码片`
plt.xlabel('A (unit)', size=12)
plt.ylabel('Intra-event Residual', fontsize=12)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# plt.text(250, 3.2, 'SA(T=10s)', fontsize=14)
plt.grid(linewidth=0.5, linestyle='--', which='both', alpha=0.5, zorder=0)
#绘制网格线
plt.ylim(-6, 4)
# plt.tight_layout()
# plt.show()
plt.savefig('Figure_residual.png', dpi=300)

最终生成的结果见上图

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值