【问题标题】:Matplotlib: Hang up on conditional plottingMatplotlib:挂断条件绘图
【发布时间】:2015-01-28 19:09:43
【问题描述】:

下面的代码挂了,

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')

情节在没有“while”条件的情况下有效。在上面的表格中它挂起。 我需要“休息”吗?

谢谢

【问题讨论】:

  • 您是否尝试从符合条件的数组中绘制值?我认为这通常使用plt.plot(xdat[bool_array], ydat[bool_array], ...) 之类的东西来完成。您将bool_array 定义为bool_array = (ydat &gt; y_thresh) &amp; (xdat &lt; x_thresh) 之类的东西。您不需要 while 语句来执行此操作。
  • 或者,如果您只是想绘制一个点,您可能想要使用if 而不是while
  • 是的,条件是
  • 是的,条件是:np.any((np.log10((O3 / HB))
  • 您需要提供代码的minimal complete example。一个好的起点是提供一个最小的示例,说明如何定义 N2HAHBO3?我们不想要您的整个代码。我还怀疑这个代码块在另一个循环中。我说的对吗?

标签: python matplotlib


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    问题讨论

    代码冻结是因为您正在使用带有一个条件的while 循环,该条件的变量在循环内不会改变。因此,如果条件在循环中第一次计算为True,它将无限期地计算为True(即代码“挂起”)。通常(除非您希望循环永远运行)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 循环的 sn-p),条件语句也有可能始终计算为 True。在这种情况下,您将永远不会退出 while 循环,您的代码将“挂起”。

    可能的解决方案

    有几种方法可以解决您的问题,具体取决于您要执行的操作:

    1. 如果您只想绘制一次数据,请使用if 而不是while

    2. 如果您只是向我们展示循环的 sn-p 并且条件语句 do 中的变量在循环内发生变化,我建议:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 2013-04-06
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2018-11-26
      相关资源
      最近更新 更多