用python画平滑曲线时,报错“ValueError: Expect x to be a 1-D sorted array_like.”的解决方法

今天写实验报告,需要将一组实验数据进行画图可视化显示,于是就打算用阿py来实现(毕竟和阿py相处这么多年了),但没错我是个不是太有经验的“cv战士”,图方便从网上搜索“python画给定点平滑曲线图”,将数据改成自己的之后,就直接run了,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline

# 两个是配置代码,第一行表示,允许使用中文,第二个表示允许使用负数
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 这三个表示就跟名字一样,标识作用
plt.title("误码率随入射光功率变化曲线")
plt.xlabel("入射光功率(W)")
plt.ylabel("误码率(dBm)")

# 这个前两参数表示横坐标的开始和结尾,第三个参数表示你要分成多少份
x = np.linspace(0, 500, 100000)

# 下面是节点个状态信息,一定要使用numpy自带的array,不然会出错
node1State = np.array([-3.29,-5.009,-8.834,-11.01,-13.079,-14.748,-17.289,-19.437,-20.748,-23.437])
times = np.array([468.812,315.479,146.286,79.245,49.220,33.515,18.664,11.384,8.419,4.532])

# 这个就是最重要的平滑操作了,要是不使用这个操作的话,画出来的就是点和点之间的直线
model0 = make_interp_spline(times, node1State)
ys0 = model0(x)

# 给每条线设定颜色,和添加label,linestyle表示你要使用曲线的样式,有多少种网上有
plt.plot(x, ys0, color='red', label='Node 0')

# legend() 函数只有在你需要使用laber 这个参数的时候才会用到
plt.legend()
plt.show()

诶诶但是,报错了!!!没想到的是这么简单的一段代码!报错了!

报的什么错呢?如下图

 0098fb558a0842d78488ef4080a1a2e4.png

60d4cd68fd524d1c9e6d5a2df213b661.png  我也找了很多遇到过同样问题的文章和解决方法:大概意思就是说x对应了两个y值,但我寻思我这些数对也没重复的情况哇,然后就尝试着点进所调用库文件函数,发现了!就是说X取值的这个数组,得正方向,即从小到大排序:a[i]<a[i+1]

最后通过np.argsort()函数将原数组进行从小到大排序,最后没有报错并且画出了图~附上正确代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline

# 两个是配置代码,第一行表示,允许使用中文,第二个表示允许使用负数
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 这三个表示就跟名字一样,标识作用
plt.title("误码率随入射光功率变化曲线")
plt.xlabel("入射光功率(W)")
plt.ylabel("误码率(dBm)")

# 这个前两参数表示横坐标的开始和结尾,第三个参数表示你要分成多少份
x = np.linspace(0, 500, 100000)

# 下面是节点个状态信息,一定要使用numpy自带的array,不然会出错
node1State = np.array([-3.29,-5.009,-8.834,-11.01,-13.079,-14.748,-17.289,-19.437,-20.748,-23.437])
times = np.array([468.812,315.479,461.286,79.245,49.220,33.515,18.664,11.384,8.419,4.532])
node1State=node1State[np.argsort(node1State)]
times=times[np.argsort(times)]
print(node1State)
print(times)
# 这个就是最重要的平滑操作了,要是不使用这个操作的话,画出来的就是点和点之间的直线
model0 = make_interp_spline(times, node1State)
ys0 = model0(x)

# 给每条线设定颜色,和添加label,linestyle表示你要使用曲线的样式,有多少种网上有
plt.plot(x, ys0, color='red', label='Node 0')

# legend() 函数只有在你需要使用laber 这个参数的时候才会用到
plt.legend()
plt.show()

c2fee418fbd74656acd8eaa24336b6f9.png

 

 总结:

(1)“ValueError: Expect x to be a 1-D sorted array_like.”报错时,不光可能是一个x对应2个y的原因,也有可能是因为数组没有从小到大排列。

(2)np.argsort()可有对array数组进行从小到大的排序。

解决问题~撒花~~❀❀❀

ec45166cac5c4f8dac8b5fc1c6be5c8d.png

 

     

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离子源啦啦啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值