找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 895|回复: 2

[求助] 求助!matlibplot出图咋这么难看?

1

主题

2

帖子

2

积分

贫民

积分
2
铁牛125 发表于 2022-6-24 08:52:12 | 显示全部楼层 |阅读模式
#   感谢大佬指导!!

我这里用代码搞了一张图,但是图中两个问题:一是样本有很多没数据的,用0代替,但是不能参与回归计算,怎么跳过?二是这个曲线怎么绕来绕去的?

用的是matlibplot库里面的出图模块,回归用的是curve_fit方法

# =============================================================================
# =======本段为导入模型用的基础数据
# ==输入:
# 1-Rrs文件名
# 2-高相关波段1数字
# 3-高相关波段2
# 4-Conc 文件名
# 5-关注的污染物名
# ==输出:
# 6-计算相关系数的 X  就是Model用的R/R
# 7-计算相关系数的 Y  就是Model 用的污染物浓度
# =============================================================================
import pandas as pd



_n1 =int(input('第一波段是_____nm:'))   #用int把 输入的字符串 变成 整数

_n2 =int(input('第二波段是_____nm:'))   #用int把 输入的字符串 变成 整数

# 把输入名字的文件导入数组,再分别做俩字符串 R(n1)和 R(n2)
s = pd.read_csv(PRrs.csv, index_col='Wvl')

R1 = s.loc[_n1]
R2 = s.loc[_n2]

#给出X的数列
x = list(R1/R2)
# 设置y
_conc_ = pd.read_excel(Conc.xlsx, index_col="No.")
print(_conc_.columns)
_c1_name = input('从前一行选择污染物:')



y = list(_conc_.get(_c1_name))


x_arr = np.array(x)
y_arr = np.array(y)



# =============================================================================
# 起草各阶函数方程
# =============================================================================

# 线性相关方程
def func_1(x, a, b):
    return a*x +b

# 一元二次方程
def func_2(x, a, b, c):
    return a*np.power(x,2) + b*x +c

#对数方程
def func_log(x, a, b):
    return a* np.log(x) + b

#指数方程
def func_exp(x, a, b):
    return a*np.exp(b*x)



# =============================================================================
# 获取拟合后的各个参数
# =============================================================================
# popt是所得拟合方程的参数 ,一维数组  ?a b c d?
# pcov 是所得拟合方程的协方差 , 二维数组   ?协方差

# 拟合参数都放在popt里,popt是个数组,参数顺序即你自定义函数中传入的参数的顺序
popt1, pcov1 = curve_fit(func_1, x_arr, y_arr)   # 线性
a1 = popt1[0]
b1 = popt1[1]
print("popt1:" , popt1)

popt2, pcov2 = curve_fit(func_2, x_arr, y_arr)   # 一元二次
a2 = popt2[0]
b2 = popt2[1]
c2 = popt2[2]
print("popt2:", popt2)

popt3, pcov3 = curve_fit(func_log, x_arr, y_arr)  #对数
a3 = popt3[0]
b3 = popt3[1]
print("popt-log:", popt3)


popt4, pcov4 = curve_fit(func_exp, x_arr, y_arr)   #指数
a4 = popt4[0]
b4 = popt4[1]
print("popt-exp:", popt4)





# =============================================================================
# 用一下拟合方程结果,以x arr求一遍   y, 这里用 y vals
# =============================================================================
yvals1 = func_1(x_arr, a1, b1)  #以Xarr为基数,开始线性公式计算
print("公式:y=ax + b,a=%.2f, b=%.2f , 线性拟合数组为:"  
      %(a1, b1)
      )

yvals2 = func_2(x_arr, a2, b2, c2) #以Xarr为基数,开始一元二次公式计算
print("公式:y=ax^2+bx+c, a=%.2f, b=%.2f, c=%.2f, 一元二次拟合数组为: "
      %(a2, b2, c2)
      )

yvals3 = func_log(x_arr, a3, b3)  #以Xarr为基数,开始对数公式计算
print("公式:y=a(ln(x)) + b,a=%.2f, b=%.2f , 对数拟合数组为:"  
      %(a3, b3)
      )

yvals4 = func_exp(x_arr, a4, b4,)   # 指数
print("公式:y=a(exp(b*x),a=%.2f, b=%.2f , 指数拟合数组为:"  
      %(a4, b4)
      )






# =============================================================================
# 出图
# =============================================================================
figure3 = plt.figure(figsize=(16,9))

plt.plot(x_arr, yvals4, label='指数拟合曲线')   #图上的曲线,                                                                               但是咋这么难看????
plt.scatter(x_arr, y_arr, color='black', marker="o", label='原始数据')  #图上的散点
plt.xlabel('Band: A/B')
plt.ylabel(_c1_name)
plt.legend(loc=1)    # 指定  legend-图例  的位置 右上角-1,左上角-2,左下角-3,右下角-4

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 图形导出到svg文件
fig_out = figure3.get_figure()   #设定图形导入内存
fname = '波段比值与污染物浓度拟合曲线_'+'Band:'+str(_n1)+'比'+str(_n2)+'nm 与'+str(_c1_name)+"拟合"
plt.title(fname) #每个图加自身的名字
plt.savefig(fname+".svg",dpi=300)#保存图片 导出到svg文件  默认目录是本py文件的存储目录  /Model

plt.show()

# =============================================================================
# #################################相关系数  R^2的计算方法####################################
# =============================================================================
# https://blog.csdn.net/qq_43403025/article/details/108285275

def __sst(y_no_fitting):
    # """
    # 计算SST(total sum of squares) 总平方和
    # :param y_no_predicted: List[int] or array[int] 待拟合的y
    # :return: 总平方和SST
    # """
    y_mean = sum(y_no_fitting) / len(y_no_fitting)
    s_list =[(y - y_mean)**2 for y in y_no_fitting]
    sst = sum(s_list)
    return sst




回复

使用道具 举报

1

主题

2

帖子

2

积分

贫民

积分
2
铁牛125  楼主| 发表于 2022-6-24 12:29:52 | 显示全部楼层
C:\Users\admin\Desktop\无标题.png
回复 支持 反对

使用道具 举报

0

主题

5

帖子

5

积分

贫民

积分
5
肉蛋充肌 发表于 2022-7-18 10:16:22 | 显示全部楼层
样本有很多没数据的,用0代替,但是不能参与回归计算,怎么跳过
你应该考虑进行数据处理吧,用df.replace把0替换为缺失值NaN,然后用df.dropna()删除缺失值或者用df.fillna()用平均值等等统计值填补缺失值
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表