我想将几张图互相移动。我将数据读入数据中包含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列中的最小值”
答案 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()
答案 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()