Don*_*n99 1 python plot numpy matplotlib scipy
我想找到两个图的交集。绘制第一张图需要 674 点,绘制第二张图只需要 14 点。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv("test1.csv",,skiprows=range(9),names=['A', 'B', 'C','D'])
df2 = pd.read_csv("test2.csv",skiprows=range(1),names=['X','Y'])
x1 = df['A'].tolist()
x1 = np.array(x1)
y1 = df['D'].tolist()
y1 = np.array(y1)
x2 = df2['X'].tolist()
x2 = np.array(x2)
y2 = df2['Y'].tolist()
y2 = np.array(y2)
idx = np.argwhere(np.diff(np.sign(y1 - y2))).flatten()
fig, ax = plt.subplots()
ax.plot(x1, y1, 'blue')
ax.plot(x2, y2, 'red')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,由于 numpy 的大小不同,我从上面的代码中收到此错误。我有什么办法可以解决这个问题吗?
操作数无法与形状一起广播 (674,) (14,)
您应该使用 计算两条曲线的插值scipy.interpolate.interp1d,然后您可以使用您使用的方法计算交点的指数。
我假设您有两条带有x1、x2和坐标的曲线,具有不同的长度y1和y2x 轴限制:
x1 = np.linspace(-2, 12, 674)
x2 = np.linspace(0, 8, 14)
y1 = np.sin(x1)
y2 = np.cos(x2) + 1
Run Code Online (Sandbox Code Playgroud)
因此,您必须计算插值函数:
f1 = interp1d(x1, y1, kind = 'linear')
f2 = interp1d(x2, y2, kind = 'linear')
Run Code Online (Sandbox Code Playgroud)
然后,您需要在公共 x 轴上评估新曲线,因此新曲线将具有相同的长度:
xx = np.linspace(max(x1[0], x2[0]), min(x1[-1], x2[-1]), 1000)
y1_interp = f1(xx)
y2_interp = f2(xx)
Run Code Online (Sandbox Code Playgroud)
最后,您可以像以前一样计算插值点的索引:
idx = np.argwhere(np.diff(np.sign(y1_interp - y2_interp))).flatten()
Run Code Online (Sandbox Code Playgroud)
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
x1 = np.linspace(-2, 12, 674)
x2 = np.linspace(0, 8, 14)
y1 = np.sin(x1)
y2 = np.cos(x2) + 1
f1 = interp1d(x1, y1, kind = 'linear')
f2 = interp1d(x2, y2, kind = 'linear')
xx = np.linspace(max(x1[0], x2[0]), min(x1[-1], x2[-1]), 1000)
y1_interp = f1(xx)
y2_interp = f2(xx)
idx = np.argwhere(np.diff(np.sign(y1_interp - y2_interp))).flatten()
fig, ax = plt.subplots()
ax.plot(x1, y1, 'blue', label = 'y1')
ax.plot(x2, y2, 'red', label = 'y2')
for index in idx:
ax.plot(xx[index], y1_interp[index], marker = 'o', markerfacecolor = 'black', markeredgecolor = 'black')
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1246 次 |
| 最近记录: |