在matplotlib中显示图

时间:2017-07-19 17:04:30

标签: python matplotlib

我对matplotlib中的show()方法有疑问。我有一个for循环(对于肽),在这个循环中我有另一个循环(对于TFE)。在for TFE循环中,我绘制了2个不同的数字,在退出TFE循环后,我想绘制第三个数字。问题是,如果我在绘制第二个数字后绘制plt.show()(而不是像下面的代码中的fig1.show()和fig2。show()),它也会向我显示空的第三个数字(已创建)在第一个肽步骤之后,在环之前,但在它们之后绘制)。此外,每个肽步骤仅绘制图3中的一个图,因为它似乎显示()清除了先前在图(3)上完成的工作。我希望在每个肽步骤中绘制图形(3),但是它在前面的步骤中保留了绘图(并且没有被plt.show()破坏)并且仅在最后显示。

我想使用fig1.show()和fig2.show()但是当我在第一个TFE循环中关闭2个数字中的一个时,图(3)显示正确,只有TFE循环的其他数字出现未显示,以下内容显示在终端中: 无效的命令名称“139620086899400idle_draw”     执行时 “139620086899400idle_draw”     (“后”剧本)

您能否对我提到的无效命令名称有所了解,我该怎么做才能解决问题?我没有粘贴整个代码,因为它很长而且很乱,但我认为它足以理解一个问题。

编辑:好的,我创建了最少的代码,我的问题是:fig1和fig2显示每个肽步骤的图表(执行代码时,每个步骤的图表都添加了图表)。我想要fig3,它按预期返回,但对于fig1和fig2,我实际上想要每个肽步骤2个数字,所以我有fig1和fig2数字的肽数和1 fig3数字。

import matplotlib.pyplot as plt
from scipy import stats
fig3 = plt.figure(3)
dictionary = {"peptide1": {5: {"deltaG": -15.5, "Fhteor": [0.9, 0.88], "T": [40, 45]}, 10: {"deltaG": -14.5, "Fhteor": [0.85, 0.83], "T": [40, 45]}},
"peptide666":{5: {"deltaG": -5.5, "Fhteor": [0.6, 0.57], "T": [40, 45]}, 10: {"deltaG": 1, "Fhteor": [0.4, 0.33], "T": [40, 45]}}}
for peptide in dictionary:
    TFE_list = []
    dG_list = []
    fig1 = plt.figure(1)
    fig2 = plt.figure(2)
    for TFE in dictionary[peptide]:
        plt.figure(1)
        plt.plot(TFE, dictionary[peptide][TFE]["deltaG"], marker = "o") #plotting on fig1
        plt.figure(2)
        plt.plot(dictionary[peptide][TFE]["T"], dictionary[peptide][TFE]["Fhteor"], marker = "v") #plotting on fig2
        if TFE <= 15:
            TFE_list.append(TFE)
            dG_list.append(dictionary[peptide][TFE]["deltaG"])

    plt.figure(1)
    lr = stats.linregress(TFE_list, dG_list)
    y_list = [lr.intercept + i*lr.slope for i in TFE_list]
    plt.plot(TFE_list, y_list) #plotting linear regression on plot 1
    fig1.show()
    fig2.show()
    plt.figure(3)
    plt.plot(len(peptide), len(peptide)*3, marker ="o") #plotting some characteristics derived from "for TFE loop" on fig3
plt.show()

2 个答案:

答案 0 :(得分:1)

fig1.close()之后立即添加fig1.show()时会发生什么?

另外,我非常肯定将plt.figure(2)放在for循环中会导致问题,更不用说你在for循环之外声明变量fig2 = plt.figure(2)的事实了在循环中也称为plt.figure(2)。自从我使用matplotlib以来已经有一段时间但是我不认为你应该在for循环中放置一个plt.figure(),除非你循环多个数字,即:

for i in range(len(all_figures_to_be_plotted)):
    plt.figure(i)

答案 1 :(得分:0)

问题在于启动图(1)和图(2)。它们是在第一步中启动的,但是在下一步中它们被调用并且绘图被叠加。答案是正确的启动,例如:

for dictionary in dictionary:     fig1 = plt.figure(peptide + str(1))     fig2 = plt.figure(peptide + str(2))

str(1)和str(2)旨在区分这两个图。 Stil不知道消息是什么:&#34; 139620086899400idle_draw&#34;执行&#34; 139620086899400idle_draw&#34; (&#34;在&#34;脚本之后)意味着,但在那时它不再重要。