Matplotlib:挂断条件绘图

时间:2015-01-28 19:09:43

标签: python matplotlib

以下代码挂起,

while np.any((np.log10((O3 / HB)) < 0.61 / (np.log10(N2 / HA) - 0.05) + 1.3).any()):
    plt.plot(np.array(np.log10(N2 / HA)), np.array(np.log10(O3 / HB)), '.g')
plt.plot(np.array(np.log10(N2 / HA)), np.array(np.log10(O3 / HB)), '.r')

情节没有&#34;而#34;条件。在上面的形式它挂起。 我是否需要&#34;休息&#34;?

感谢

2 个答案:

答案 0 :(得分:0)

代码可能会冻结,因为每次循环迭代时你都会创建一个新的绘图对象,最终你会耗尽内存。该程序通常会在20个左右的图表后发出警告。

您可以每次清除轴作为替代,或

When to use cla(), clf() or close() for clearing a plot in matplotlib?

或者您可以使用.set_xdataset_ydata命令来简单地更新数据。或者,如果要覆盖数据,则可以重复使用相同的轴。

答案 1 :(得分:0)

问题讨论

代码冻结是因为您正在使用while循环,其条件的变量在循环内不会发生变化。因此,如果条件在第一次循环时评估为True,则它将无限期地评估为True(即代码“挂起”#39;)。通常(除非您希望循环永久运行)while循环中的一个或多个变量将在循环内发生变化。一个非常简单的例子是,

while index < 10:
    plt.plot(x_data[index], y_data[index])
    index += 1  # Here the index changes.

注意:出于这些目的,更常见的是使用for index in range(10):或更好for xd, yd in zip(x_data, y_data): plt.plot(xd, yd)而不是while循环,因为那样你就不会需要有index += 1行,并且在循环开始时它会更清楚。我只是将此作为while的明确示例使用。

即使条件变量确实在循环内发生了变化(即如果你只提供了while循环的片段),条件语句总是可以计算为True 。在这种情况下,再次,您永远不会退出while循环,您的代码将会“挂起”。

潜在解决方案

根据您的目的,您可以采用多种方法解决问题:

  1. 如果您只想绘制一次数据,请使用if代替while

  2. 如果你只是向我们展示你的循环片段,并且条件语句中的变量在循环中发生变化,我建议:

    A)首先在循环顶部放置print(np.any((np.log10((O3 / HB)) < 0.61 / (np.log10(N2 / HA) - 0.05) + 1.3).any()))并运行代码。我认为这会将True转储到您的控制台。

    B)然后,您可以使用更多的打印语句(例如print('N2: %f' % N2))来区分此语句,以了解为什么您的语句永远不会评估False,因此您永远不会退出循环。