Python 在Matplotlib中保存双循环枚举中的图形

Python 在Matplotlib中保存双循环枚举中的图形,python,numpy,matplotlib,Python,Numpy,Matplotlib,我试图构建一个脚本,在整个范围内循环并保存一个主分量与另一个主分量的所有图形,没有重复,也没有相同与相同,--例如,如果我生成对称矩阵3乘3,我将有3个有意义的图形:图1\u 2、图1\u 3和图2\u 3。我带着那辆马车来的 #!/usr/env python import mdp import numpy as np import matplotlib.pyplot as plt # set1 = 'set1_smthing.txt' set2 = 'set2_smthing.txt' se

我试图构建一个脚本,在整个范围内循环并保存一个主分量与另一个主分量的所有图形,没有重复,也没有相同与相同,--例如,如果我生成对称矩阵3乘3,我将有3个有意义的图形:图1\u 2、图1\u 3和图2\u 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)
#/usr/env python
导入mdp
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#
set1='set1\u smthing.txt'
set2='set2\u smthing.txt'
set3='set3\u smthing.txt'
bname=set1.split(“.”[0]。split(“”)[0]
set1d=np.loadtxt(set1,分隔符=',')
set2d=np.loadtxt(set2,分隔符=',')
set3d=np.loadtxt(fchembl,分隔符=',')
set_comb=np.vstack([set1d,set2d,set3d])
#使用MDP执行PCA
set\u comb\u pca=mdp.pca(set\u comb,svd=True)
pcan=mdp.nodes.PCANode(输出尺寸=3)
pcar=pcan.execute(设置梳)
#用图表显示结果-下三角
对于范围(1,6)内的i:
对于范围(1,6)内的j:
如果我j和i
脚本只生成1个图PC1和PC2,然后退出。我的bug似乎在枚举中。你能建议我改正一下吗?我用: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

[]
[]
[]
回溯(最近一次呼叫最后一次):
文件“”,第9行,在
索引器:索引无效

我可以告诉你,你是前Matlab程序员。你会爱上基于0的索引

您有一个索引器,但调试起来很困难,因为您索引了太多不同的东西,通常在每一行上多次。将代码放入脚本并运行它(
runmain.py
在ipython中或从终端运行
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)

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

我可以告诉您,您是一位前Matlab程序员。你会爱上基于0的索引

您有一个索引器,但调试起来很困难,因为您索引了太多不同的东西,通常在每一行上多次。将代码放入脚本并运行它(
runmain.py
在ipython中或从终端运行
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)

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

是否检查了set1.split(“.”)或set1.split(“.”[0]。split(“”)?是的,这是正确的。我用print-gname测试了枚举-没问题。你是如何运行这个的?您的代码和
len(pcan.d)
的内容没有意义。很难说您想做什么,但要调试代码,如果您在循环之前添加一个
print pcar.shape
,并共享结果,则会很有帮助。您是否检查了set1.split(“.”或set1.split(“.”[0]。split(“”)的内容?是,没错。我用print-gname测试了枚举-没问题。你是如何运行这个的?你的代码和什么是
len(pcan.d)
?很难说你想做什么,但是要调试你的代码,如果你在循环之前添加一个
print pcar.shape
,并分享结果会很有帮助。非常感谢!我对python还不熟悉,但正在努力学习。我给了我很多想法去思考和研究。我收到了所有的数字,但产生了一些消息:文件“”,第5行,在索引器中:无效索引>>>无法调用“事件”命令:应用程序在执行从“ttk::ThemeChanged”中调用的“event generate$w”(过程“ttk::ThemeChanged”第6行)时已被破坏,非常感谢!我对python还不熟悉,但正在努力学习。我给了我很多想法去思考和研究。我收到了所有的数字,但生成了一些消息:文件“”,第5行,在索引器中:无效索引>>>无法调用“事件”命令:应用程序在执行从“ttk::ThemeChanged”中调用的“event generate$w”(过程“ttk::ThemeChanged”第6行)时被破坏