今天写实验报告,需要将一组实验数据进行画图可视化显示,于是就打算用阿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()
诶诶但是,报错了!!!没想到的是这么简单的一段代码!报错了!
报的什么错呢?如下图
我也找了很多遇到过同样问题的文章和解决方法:大概意思就是说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()
总结:
(1)“ValueError: Expect x to be a 1-D sorted array_like.”报错时,不光可能是一个x对应2个y的原因,也有可能是因为数组没有从小到大排列。
(2)np.argsort()可有对array数组进行从小到大的排序。
解决问题~撒花~~❀❀❀