首页 > 解决方案 > 在 matplotlib 中减去两个图

问题描述

我有两个要减去的图,但是遇到了一些错误。我的代码如下所示:

一般来说:

for dataset in [Bxfft]:
    dataset = np.asarray(dataset)
    freqs, psd = signal.welch(dataset, fs=52718/300, window='hamming', nperseg=16384, scaling='spectrum')
    plt.semilogy(freqs[5:4600], psd[5:4600]/dataset.size**0, color='r', label='Bx')

    x = freqs[5:361]
    y = psd[5:361]
    x2 = freqs[5:4600]
    y2 = psd[5:4600]

我试图完成的是减去x2 - xy2 - y。我尝试通过两种方式做到这一点,但我遇到了一些错误:

  1. o = x-x2[:,:361] o2 = y-y2[:,:361] plt.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')

错误如下所示:

回溯(最后一次调用):文件“S:/Doktorat/Python/Data/Dekomp/substraction.py”,第 57 行,在 o = x-x2[:,:4800] IndexError:数组索引过多

  1. o = x2-x o2 = y2-y plt.semilogy(o, o2 / dataset.size ** 0, color='r', label='Bx')

错误如下所示:

Traceback(最近一次调用最后一次):文件“S:/Doktorat/Python/Data/Dekomp/substraction.py”,第 57 行,在 o = x2-x ValueError:操作数无法与形状一起广播(4595,)( 356,)

有什么想法该怎么做?

标签: python-2.7matplotlibsubtraction

解决方案


您的x, x2, y,y2数组似乎是一维的,

所以你的第一个直觉是正确的,但你必须在你减去的数组切片中做一个小的修正:

o = x-x2[:356] # 361-5 = 356
o2 = y-y2[:356]

一个可行的例子是:

import numpy as np

freqs = np.random.rand(4600)
psd = np.random.rand(4600)

x = freqs[5:361]
y = psd[5:361]
x2 = freqs[5:4600]
y2 = psd[5:4600]

o = x-x2[:356]
o2 = y-y2[:356]

编辑绘图示例:

import numpy as np
import matplotlib.pyplot as plt

freqs = np.random.rand(4600)
psd = np.random.rand(4600)

x = freqs[5:361]
y = psd[5:361]
x2 = freqs[5:4600]
y2 = psd[5:4600]

o = abs(x-x2[1:357])
o2 = abs(y-y2[1:357])

plt.semilogy(o, o2, '*',color='r', label='Bx')

plt.show()

数组切片解释

根据您的代码,您有 2 个数组(freqpsd),每个数组都是一维的,并且至少包含 4600 个值。

当你这样做

x = freqs[5:361]
x = psd[5:361]

您正在提取从第 5 个位置到第 361 个位置的所有值,x因此y每个值包含 356 个值。

当你这样做时:x2 = freqs[5:4600] y2 = psd[5:4600]

您正在提取从第 5 个位置(与以前相同)到第 4600 个位置的所有值,x2因此y2每个值包含 3595 个值

稍后您尝试减去x2x首先使用x2[:,:361]which 意味着您正在考虑x2成为 2d 数组,而实际上它是 1d 会导致错误。

然后你尝试做o = x2-x但是 asx包含 356 个值并且x2包含 3595 个值 python 不知道该怎么做。

例如,如果您想在一个非常简单的示例中将前 3 个值减去以下 3 个值,您可以执行以下操作:

freq = np.array([3,3,3,2,2,2])
x1 = freq[0:3] # x1 =  array([3, 3, 3])
x2 = freq[3:6] # x2 =  array([2, 2, 2])

result = x1 - x2 # result = array([1, 1, 1])

推荐阅读