pylab.plot绘制分段定义域函数时错误连接点,该如何解决?
解决pylab.plot绘制分段不连续曲线的连接问题
问题出在你用来绘图的x数组是把两段定义域的数值放在同一个连续数组里,pylab.plot默认会按数组顺序连接所有相邻点,自然就把左边段的终点(x=-1)和右边段的起点(x=1)连起来了——这和绘图方法无关,是数据组织的问题。
给你两个简单的解决办法:
分开绘制两段曲线
分别生成左边定义域和右边定义域的x数组,计算对应y值后,调用两次pylab.plot()分别绘制左右两段:import pylab import numpy as np # 生成左右两段的x数据 x_left = np.linspace(-5, -1, 100) x_right = np.linspace(1, 5, 100) # 计算对应y值 y_left = x_left * np.sqrt(x_left**2 - 1) / (x_left**2 + 1) y_right = x_right * np.sqrt(x_right**2 - 1) / (x_right**2 + 1) # 分别绘制两段 pylab.plot(x_left, y_left) pylab.plot(x_right, y_right) pylab.show()在两段数据之间插入NaN值
如果想只用一次plot命令,可以在合并的x数组里,在左右段之间插入一个NaN值——pylab.plot遇到NaN会自动断开曲线:import pylab import numpy as np # 生成两段x数据并插入NaN分隔 x_left = np.linspace(-5, -1, 100) x_right = np.linspace(1, 5, 100) x = np.concatenate([x_left, [np.nan], x_right]) # 计算y值,NaN对应的y也会是NaN y = x * np.sqrt(x**2 - 1) / (x**2 + 1) # 一次绘制即可自动断开 pylab.plot(x, y) pylab.show()
另外补充下:你最初没考虑定义域时,虽然有RuntimeWarning,但numpy计算负数的sqrt会得到NaN,这些NaN对应的点不会被绘制,曲线自然断开,所以当时图形符合预期。修正定义域后你应该是过滤掉了中间的NaN,导致数组里的点变成连续的左右段,才出现了错误连接的情况。
内容的提问来源于stack exchange,提问作者Marc Le Bihan
相关产品推荐
相关产品推荐

