快来垃圾 2023-09-15 22:01 采纳率: 0%
浏览 1

三次样条函数用python语言实现,效果图如图2,但绘制出了图1,代码如下,问题在哪,求解答

import numpy as np
import matplotlib.pyplot as plt
 
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#数据准备
X= np.loadtxt("E:/20230914/data/2017124.txt", delimiter=",", usecols=(0),dtype=float)
Y= np.loadtxt("E:/20230914/data/2017124.txt", delimiter=",", usecols=(1),dtype=float)
new_x=np.arange(0.001,2,0.001) #定义差值点

#进行样条差值
import scipy.interpolate as spi

#进行三次样条拟合
ipo3=spi.splrep(X,Y,k=3) #样本点导入,生成参数
iy3=spi.splev(new_x,ipo3) #根据观测点和样条参数,生成插值

##作图
fig, ax = plt.subplots(figsize=(8,8),dpi=300)
#fig.canvas.draw()
#fig.canvas.flush_events()
ax.set_xscale('log')
ax.plot(X,Y,'o',label='实测点')
ax.plot(new_x,iy3,label='插值点')
ax.set_ylim(Y.min()-1,Y.max()+1)
plt.tick_params(labelsize=14) #刻度值字体大小设置(x轴和y轴同时设置)
ax.set_ylabel('沙重百分数',fontsize=14)
ax.set_xlabel('泥沙粒径',fontsize=14)
ax.set_title('泥沙级配曲线图三次样条插值',fontsize=14)
#设置主网格线
ax.grid(color ="black")

#设置次网格线
ax.minorticks_on()
ax.grid(which='minor', linestyle=':', linewidth='0.5', color='gray')
ax.legend(fontsize=14)\

#保存图片至指定路径
fig = plt.gcf()
fig.savefig('E:/20230914/figure/2017124.jpg',dpi=300,bbox_inches='tight')
plt.show()

图1

img

图2

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-09-16 00:05
    关注

    引用 皆我百晓生 小程序回复内容作答:
    在代码的最后,调用了plt.show()来显示图形。这个函数会在显示图形的时候暂停程序的运行,直到关闭图形窗口。所以在调用plt.show()之后的代码不会被执行。

    解决方法是将plt.show()移动到代码的最后,即将最后两行的代码交换一下位置。

    修正后的代码如下:

    import numpy as np
    import matplotlib.pyplot as plt
     
    plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
     
    #数据准备
    X= np.loadtxt("E:/20230914/data/2017124.txt", delimiter=",", usecols=(0),dtype=float)
    Y= np.loadtxt("E:/20230914/data/2017124.txt", delimiter=",", usecols=(1),dtype=float)
    new_x=np.arange(0.001,2,0.001) #定义差值点
     
    #进行样条差值
    import scipy.interpolate as spi
     
    #进行三次样条拟合
    ipo3=spi.splrep(X,Y,k=3) #样本点导入,生成参数
    iy3=spi.splev(new_x,ipo3) #根据观测点和样条参数,生成插值
     
    ##作图
    fig, ax = plt.subplots(figsize=(8,8),dpi=300)
    ax.set_xscale('log')
    ax.plot(X,Y,'o',label='实测点')
    ax.plot(new_x,iy3,label='插值点')
    ax.set_ylim(Y.min()-1,Y.max()+1)
    plt.tick_params(labelsize=14) #刻度值字体大小设置(x轴和y轴同时设置)
    ax.set_ylabel('沙重百分数',fontsize=14)
    ax.set_xlabel('泥沙粒径',fontsize=14)
    ax.set_title('泥沙级配曲线图三次样条插值',fontsize=14)
    #设置主网格线
    ax.grid(color ="black")
     
    #设置次网格线
    ax.minorticks_on()
    ax.grid(which='minor', linestyle=':', linewidth='0.5', color='gray')
    ax.legend(fontsize=14)
     
    #保存图片至指定路径
    fig = plt.gcf()
    fig.savefig('E:/20230914/figure/2017124.jpg',dpi=300,bbox_inches='tight')
    plt.show()
    
    评论

报告相同问题?

问题事件

  • 修改了问题 9月15日
  • 修改了问题 9月15日
  • 创建了问题 9月15日