在matplotlib中绘制数据文件中的数据
我有一个测试数据文件,里面有16行和3列,内容大概是这样的:
4.0 4.0 0.992561656631
7.33333333333 4.0 0.983625465545
4.0 7.33333333333 0.983625465545
7.33333333333 7.33333333333 0.973260418741
10.6666666667 4.0 0.973385993787
4.0 10.6666666667 0.973385993787
10.6666666667 7.33333333333 0.96232158762
7.33333333333 10.6666666667 0.96232158762
10.6666666667 10.6666666667 0.947002325682
14.0 4.0 0.963985902172
4.0 14.0 0.963985902172
14.0 7.33333333333 0.948250293872
7.33333333333 14.0 0.948250293872
14.0 10.6666666667 0.933855073978
10.6666666667 14.0 0.933855073978
14.0 14.0 0.91658870141
实际上,前两列表示坐标,第三列则表示在这个坐标下的函数值。你可以把这个表格想象成一个4x4的矩阵,如果你愿意的话。
现在,我想把这个数据文件绘制成一个五颜六色的二维图,前两列显示坐标,第三列则用来表示方块的颜色。
下面是我用来绘图的代码的一部分:
x3,y3,z3 = np.loadtxt("./data/FDFD_Real_Effectualness_m1m2_mo_%s_%s.dat" % (waveform2, waveform1)).T
nrows, ncols = final_step_j-1, final_step_k-1
grid3 = z3.reshape((nrows, ncols))
fig3 = plt.gcf()
plt.xlabel('$m_1$')
plt.ylabel('$m_2$')
plt.imshow(grid3, extent=(x3.min(), x3.max(), y3.min(), y3.max()), origin='lower', aspect='auto', interpolation='nearest', cmap=cm.gist_rainbow)
fig3.suptitle('Effectualness of %s and %s' % (waveform1, waveform2))
plt.colorbar()
plt.draw()
fig3.savefig('./plots/FDFD_Real_Effectualness_m1m2_mo_%s_%s.pdf' %(waveform1, waveform2), dpi=100)
plt.close()
但是结果看起来并没有达到预期(附上的图片)。特别是,从数据来看,结果应该是对角对称的。欢迎任何建议。

1 个回答
2
在把你的数据变成网格之前,你需要先对数据进行排序:
import pylab as pl
import io
import numpy as np
txt = """4.0 4.0 0.992561656631
7.33333333333 4.0 0.983625465545
4.0 7.33333333333 0.983625465545
7.33333333333 7.33333333333 0.973260418741
10.6666666667 4.0 0.973385993787
4.0 10.6666666667 0.973385993787
10.6666666667 7.33333333333 0.96232158762
7.33333333333 10.6666666667 0.96232158762
10.6666666667 10.6666666667 0.947002325682
14.0 4.0 0.963985902172
4.0 14.0 0.963985902172
14.0 7.33333333333 0.948250293872
7.33333333333 14.0 0.948250293872
14.0 10.6666666667 0.933855073978
10.6666666667 14.0 0.933855073978
14.0 14.0 0.91658870141"""
data = np.loadtxt(io.BytesIO(txt), delimiter=" ")
idx = np.lexsort((data[:, 0], data[:, 1]))
data = data[idx]
pl.imshow(data[:, 2].reshape(4, 4), origin='lower', interpolation='nearest')
这是输出的结果: