将多个图形相互移动

时间:2014-01-31 09:43:12

标签: python numpy matplotlib

我想将几张图互相移动。我将数据读入数据中包含4列的数组:

# load data for variable intensities
data_with_minimum = []
for i in [6, 12, 25, 50, 100]:
   data_with_minimum.append(np.loadtxt('data{0}.dat'.format(i)))

然后我搜索一个特征点,在这种情况下,前5000行中的最小值(我知道总有最小值)并保存了indix。

# open arrays for minimum value and index
m = []
mi = []
for k in range(5):
    m.append(0)
    mi.append(0)
    # search minimum in first 5000 data points
    for i in range(5000):
        if m[k] > data_with_minimum[k][i,1]:
            m[k] = data_with_minimum[k][i,1]
            mi[k] = i

最后,我想将第一列中的每个最小值移到彼此之下:

# shift x-axis
for i in range(30000 - m_max):
    for k in range(5):
        data_with_minimum[k][i,1] = data_with_minimum[k][i+(mi[k]-min(mi)),1]

不幸的是,这不起作用,因为值正在重新定义。因为我对Python很陌生,所以我陷入困境。所以任何建议都会有所帮助。或者通常可能有更简单的方法来解决这个问题?这在我看来很不方便..谢谢!

编辑:

1)遗憾的是我无法发布图片,因为我没有足够的声望点。所以我需要发布此链接shift graphs。对不起。我的目标是所有图表的最小值都在同一点。使用以下命令绘制此图:

plt.figure(0)
for i in range(5):
    plt.plot(data_with_minimum[i][:,0], data_with_minimum[i][:,1])

最小数据示例:

x   y(file1) y(file2) y(file3)
1   5        8        3
2   3        6        1
3   1        5        5
4   2        3        8
5   5        1        10
6   8        3        13
7   10       4        15
8   14       7        18
9   16       10       20
...

这应该成为

x   y(file1) y(file2) y(file3)
1   3        3        3
2   1        1        1
3   2        3        5
4   5        4        8
5   8        7       10
6   10      10       13
7   14       -       15
8   16       -       18
9   -        -       20
...

最低为1。但值得一提的是,在5000个第一个数据点之后可能还有一个额外的最小值。 以及一个文件的真实数据的开头:

0.000000    -1.057758   
0.000200    -1.051918   
0.000400    -1.063922   
0.000600    -1.065220
0.000800    -1.069438   
0.001000    -1.065220           
0.001400    -1.065545   
0.001600    -1.077549   
0.001800    -1.072682   
0.002000    -1.082416   
0.002200    -1.078847   
0.002400    -1.090203   
0.002600    -1.087283   
0.002800    -1.095069   
0.003000    -1.090527   
0.003200    -1.098314   
0.003400    -1.100261   
0.003600    -1.108372   
0.003800    -1.103505   
0.004000    -1.111292   
0.004200    -1.107074   
0.004400    -1.113887   
0.004600    -1.112590   
0.004800    -1.127514   
0.005000    -1.115510   
0.005200    -1.127514   
...

2)将列更改为段落中的行“在这种情况下,前5000列中的最小值”

2 个答案:

答案 0 :(得分:0)

如果没有MWE,这很难回答。但这是我如何绘制两条线以使它们的最小值对齐:

import numpy as np
np.random.seed(1)
a = np.random.random_sample(10)
b = np.random.random_sample(10)

# say we want to align "b" to "a" based on
# the minima as you describe
a_indices = np.arange(0, len(a))
b_indices = a_indices + (a.argmin() - b.argmin())

import matplotlib.pyplot as plt
plt.plot(a_indices, a)
plt.plot(b_indices, b)
plt.show()

enter image description here

答案 1 :(得分:0)

首先,您可以使用numpy的argmin更轻松,更快地找到最小值索引:

import numpy
# setup example data
x = numpy.arange(9)
data_with_minimum = numpy.array(
    [[ 5,  3,  1,  2,  5,  8, 10, 14, 16],
     [ 8,  6,  5,  3,  1,  3,  4,  7, 10],
     [ 3,  1,  5,  8, 10, 13, 15, 18, 20]])

mi = numpy.argmin(data_with_minimum, axis = 1)

然后,我想指向numpy.roll,它可用于移动/对齐数组,但如果您对绘图感兴趣,那么根本不修改数组会更优雅和合乎逻辑(并处理边界问题),但只是为了改变线图:

import matplotlib.pyplot as plt

plt.clf()

for i, row in enumerate(data_with_minimum):
    plt.plot(x - mi[i], row)

plt.xlabel('offset from minimum')
plt.show()

aligned line plots