Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印多条打印线的总和_Python_Arrays_Numpy_Matplotlib_Plot - Fatal编程技术网

Python 打印多条打印线的总和

Python 打印多条打印线的总和,python,arrays,numpy,matplotlib,plot,Python,Arrays,Numpy,Matplotlib,Plot,我使用阵列中的数据绘制了多条线。问题是我想画一条新线,显示所有这些线的总和。请记住,每组的x值是不同的。 让我举一个我正在尝试做的例子。假设我有两组(x,y)数据,如下所示: x1=np.array([1,2,3,4,5]) y1=np.array([1,3,5,7,9]) x2=np.array([3,4,5,6,7]) y2=np.array([2,4,6,8,10]) 然后,我使用np.interp xvals1=np.linspace(1,5,1000) yinterp1

我使用阵列中的数据绘制了多条线。问题是我想画一条新线,显示所有这些线的总和。请记住,每组的x值是不同的。 让我举一个我正在尝试做的例子。假设我有两组(x,y)数据,如下所示:

 x1=np.array([1,2,3,4,5])
 y1=np.array([1,3,5,7,9])
 x2=np.array([3,4,5,6,7])
 y2=np.array([2,4,6,8,10])
然后,我使用np.interp

 xvals1=np.linspace(1,5,1000)
 yinterp1 = np.interp(xvals1, x1, y1)
 plt.plot(xvals1, yinterp1)
 xvals2=np.linspace(3,7,1000)
 yinterp2 = np.interp(xvals2, x2, y2)
 plt.plot(xvals2, yinterp2)
好,现在,我想要一条额外的线,显示这两条线的总和。但如果我做了以下操作,它会给我一条线(绿色),这肯定是错误的:

xvals=np.linspace(1,7,1000)
plt.plot(xvals,yinterp1+yinterp2)


有人对此有什么想法吗?

您不能添加
y
值,因为相应的
x
值不同。要添加它们,您需要相同范围内的
x
值。例如,在您的代码中,添加的第一个点将是
f1(1)+f2(3)
的结果,这不是您想要的结果。你想要的是f1(1)+f2(1)

你宁愿这样做

 xvals1=np.linspace(1,5,5)
 yinterp1 = np.interp(xvals1, x1, y1)
 plt.plot(xvals1, yinterp1)
 xvals2=np.linspace(1,5,5)
 yinterp2 = np.interp(xvals2, x2, y2)
 plt.plot(xvals2, yinterp2)
 xvals=np.linspace(1,5,5)
 plt.plot(xvals,yinterp1+yinterp2)


此外,您还必须将
y2
的值从
1
定义为
7
,因为您需要将求和行形式
1
定义为
7
当您执行
y1+y2
时,结果是
[y1[0]+y2[0],y1[1]+y2[1],…]
。在您的特定情况下,索引对应于不同的值,因此您实际上执行的是没有物理意义的
[y1[x=1]+y2[x=3],…,y1[x=5]+y2[x=7]

我们需要屏蔽这些值,以便它们有意义,
y
为加法“对齐”。通过对齐,我的意思是相同的索引对应于相同的
x

将numpy导入为np
将matplotlib.pyplot作为plt导入
x1=np.数组([1,2,3,4,5])
y1=np.数组([1,3,5,7,9])
x2=np.数组([3,4,5,6,7])
y2=np.数组([2,4,6,8,10])
xvals1=np.linspace(1,51000)
yinterp1=np.interp(xvals1,x1,y1)
plt.绘图(xvals1,yinterp1)
xvals2=np.linspace(3,7,1000)
yinterp2=np.interp(xvals2,x2,y2)
plt.图(XVAL2,yinterp2)
xvals=np.linspace(1,7,1000)

x1_和x2_交叉点_掩码=(np.logical_和(3)
y
数据无法知道哪个
x
有意义。您正在绘制一个
x,y
集,两者的点数相同,因此不会产生错误。唯一有效的数据是
yinterp1[1当您绘制
y1+y2
时,结果是
[y1][0]+y2[0],y1[1]+y2[1],…]
。在您的特定情况下,索引对应不同的值,因此您实际上是在执行
[y1[x=1]+y2[x=3],…,y1[x=5]+y2[x=7]]
没有物理意义。是的,我明白你的意思。我所说的只是我试图做的,因为我没有其他想法,我知道这是错误的,这就是为什么我发布这个问题,以找到正确的方法。没问题,那只是掩盖数据的问题!请查看我的答案:)谢谢你的回答。这几乎就是我想要的。有没有办法让绿线覆盖整个地区?(所以我想说)1@PhilF.是的,只要操作区域合理,就可以使用任意多的数据集。这里我们手动进行屏蔽,但最好的解决方案是创建一个函数
f(x1,y1,x2,y2)
专用于返回
x1[mask]、y1[mask]、x2[mask]、y2[mask]
以及
mask
(x2中的x1∩ x1中的x2)
。非常感谢您的完整答案。我尝试了您所说的内容,效果很好!不幸的是,因为我有很多(x,y)集,所以有很多交叉掩码,在尝试了一些之后,我仍然没有得到所有这些的正确“求和”行,但我会尝试更多。再次感谢
import numpy as np
import matplotlib.pyplot as plt

x1 = np.array([1, 2, 3, 4, 5])
y1 = np.array([1, 3, 5, 7, 9])
x2 = np.array([3, 4, 5, 6, 7])
y2 = np.array([2, 4, 6, 8, 10])

xvals1 = np.linspace(1, 5, 1000)
yinterp1 = np.interp(xvals1, x1, y1)
plt.plot(xvals1, yinterp1)

xvals2 = np.linspace(3, 7, 1000)
yinterp2 = np.interp(xvals2, x2, y2)
plt.plot(xvals2, yinterp2)

xvals = np.linspace(1, 7, 1000)
x1_and_x2_intersection_mask = (np.logical_and(3 <= xvals, xvals <= 5))
xinter = xvals[x1_and_x2_intersection_mask]
yi1 = yinterp1[x1_and_x2_intersection_mask]
yi2 = yinterp2[x1_and_x2_intersection_mask]
plt.plot(xinter, yi1+yi2)
def mask_between_a_b(array, a, b):
    """I make functions when I have to use something more than once."""
    return np.logical_and(a <= array, array <= b)

# Create the masked data for the two regions where blue and orange don't share an x.
x1_mask = mask_between_a_b(x1, 1, 3)
x2_mask = mask_between_a_b(x2, 5, 7)

x1m = x1[x1_mask]
y1m = y1[x1_mask]
x2m = x2[x2_mask]
y2m = y2[x2_mask]

# Add all three regions together to get the full curve.
x = list(x1m) + list(xinter) + list(x2m)
y = list(y1m) + list(yi1+yi2) + list(y2m)
plt.plot(x, y)