保存Matplotlib中双循环枚举的数字

时间:2013-01-11 23:48:26

标签: python numpy matplotlib

我正在尝试构建一个循环通过范围并保存一个主要组件与其他主要组件的所有数字而没有重复且没有相同与相同的所有数字的脚本,例如。如果我按3生成对称矩阵3,我将得到3个有意义的数字:fig_1_2,fig_1_3和fig_2_3。我带着那个错误的解决方案

#!/usr/env python
import mdp
import numpy as np
import matplotlib.pyplot as plt
#
set1 = 'set1_smthing.txt'
set2 = 'set2_smthing.txt'
set3 = 'set3_smthing.txt'
bname = set1.split(".")[0].split("_")[0]
set1d = np.loadtxt(set1, delimiter=',')
set2d = np.loadtxt(set2, delimiter=',')
set3d = np.loadtxt(fchembl, delimiter=',')
set_comb = np.vstack([set1d,set2d,set3d])
# performing PCA with MDP
set_comb_pca = mdp.pca(set_comb,svd=True)
pcan = mdp.nodes.PCANode(output_dim=3)
pcar = pcan.execute(set_comb)
# graph the results - lower triangle
for i in range(1,6):
    for j in range(1,6):
            if i != j and i < j:
                fig = plt.figure()                                              
                ax = fig.add_subplot(111)
                ax.plot(pcar[(len(set1d)+1):(len(set1d)+len(set2d)), i], pcar[(len(set1d)+1):(len(set1d)+len(set2d)), j], marker='.', color='grey',linestyle="None")
                ax.plot(pcar[(len(set1d)+len(set2d)):, i], pcar[(len(set1d)+len(set2d)):, j], marker='.', color='blue',linestyle="None")
                ax.plot(pcar[1:len(set1d),i], pcar[1:len(set1d), j], marker='.', color='red',linestyle="None")
                # labels and title
                ax.set_xlabel('PC' + str(i) + '(%.3f%%)' % (pcan.d[i]))
                ax.set_ylabel('PC' + str(j) + '(%.3f%%)' % (pcan.d[j]))             
                plt.title(gname)                
                gname = bname + "_pc" + str(i) + "_vs_" + "pc" + str(j)             
                plt.title(bname)
                # saving image
                fig.savefig(gname + ".png")
                plt.close(fig)

该脚本只生成1个数字PC1与PC2并退出。似乎我的错误在枚举中。你能建议我纠正吗?我测试了它:print gname - 一切正常。 buggy脚本的输出如下。

<matplotlib.text.Text object at 0x11817e10>
[<matplotlib.lines.Line2D object at 0x11814610>]
[<matplotlib.lines.Line2D object at 0xd2d7710>]
[<matplotlib.lines.Line2D object at 0xd2d7bd0>]
<matplotlib.text.Text object at 0x11812690>
<matplotlib.text.Text object at 0x11814d10>
<matplotlib.text.Text object at 0x11817e10>
<matplotlib.text.Text object at 0xd2ff090>
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
IndexError: invalid index

1 个答案:

答案 0 :(得分:3)

我可以告诉你,他是一名前Matlab程序员。您将学习爱基于0的索引!

你有一个IndexError,但很难调试,因为你索引了很多不同的东西,通常是每行多次。将代码放在脚本中并运行它(ipython中的run main.py或终端中的python main.py),至少你会知道错误发生的位置。我怀疑你有一个一个一个错误,因为你好像使用了基于1的索引。

怎么样:

# Extract PCA components for each set
pca1 = pcar[:len(set1d)]
pca2 = pcar[len(set1d):len(set1d)+len(set2d)]
pca3 = pcar[-len(set3d):]

# Iterate over each pair of components
for i in range(3):
    for j in range(i+1, 3):
        f = plt.figure()
        ax = f.add_subplot(111)

        ax.plot(pca1[:, i], pca1[:, j], 'b.')
        ax.plot(pca2[:, i], pca2[:, j], 'r.')
        ax.plot(pca3[:, i], pca3[:, j], 'g.')

        ax.set_xlabel('PC%d' % i)
        ax.set_ylabel('PC%d' % j)

        plt.savefig('PC%d_vs_PC%d.png' % (i, j))
        plt.close(f)

顺便说一句,一般来说,我发现将计算代码与绘图代码分开非常有用。这就是我建议在进入循环之前分离数据集的原因。您希望绘图代码专注于绘图,而不是复杂的索引。