【问题标题】:Python equivalent to 'hold on' in MatlabPython 相当于 Matlab 中的“等待”
【发布时间】:2014-02-23 07:35:47
【问题描述】:

在 Python 的 matplotlib 中对于 Matlab 的 hold on 是否有明确的等效命令?我正在尝试将我所有的图表绘制在同一个轴上。一些图表是在for 循环内生成的,这些图表与susl 分开绘制:

import numpy as np
import matplotlib.pyplot as plt

for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()

【问题讨论】:

  • 你的意思是plt.hold(True)
  • @Cody Piersall - 它可能适用于其他人,但显然不适用于我的示例。
  • 应该指出hold=True是默认的。
  • 我希望这对我有用:LINK

标签: python matlab graph matplotlib


【解决方案1】:

使用 plt.sca(ax) 设置当前坐标区,其中 ax 是您想要激活的坐标区对象。

例如:

在第一个函数中: 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt

for i in np.arange(1,5):
    z = 68 + 4 * np.random.randn(50)
    zm = np.cumsum(z) / range(1,len(z)+1)
    plt.plot(zm)
    plt.axis([0,50,60,80])

plt.show()

在下一个函数中: def function2(...., ax=None)

if ax is None:
    fig, ax = plt.subplots(1)
else:
    plt.sca(ax)

n = np.arange(1,51)
su = 68 + 4 / np.sqrt(n)
sl = 68 - 4 / np.sqrt(n)

plt.plot(n,su,n,sl)

plt.axis([0,50,60,80])
plt.show()

【讨论】:

    【解决方案2】:

    检查pyplot 文档。为了完整起见,

    import numpy as np
    import matplotlib.pyplot as plt
    
    #evenly sampled time at 200ms intervals
    t = np.arange(0., 5., 0.2)
    
    # red dashes, blue squares and green triangles
    plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
    plt.show()
    

    【讨论】:

      【解决方案3】:

      hold on 功能在matplotlib.pyplot 中默认开启。因此,每次您在 plt.show() 之前调用 plt.plot() 时,都会将绘图添加到绘图中。在函数plt.show() 之后启动plt.plot() 会导致重绘整个画面。

      【讨论】:

      • 在使用 IPython 时你会如何解决这个问题?
      • 使用后端 %matplotlib inline 并且一个单元格内的所有 plt.plot() 将在同一帧中输出。如果将 plt.show() 放在单元格内的 plt.plot() 函数之间,它将创建更多帧,每个 plt.show() 都会创建一个新帧
      【解决方案4】:

      您可以使用以下内容:

      plt.hold(True)
      

      【讨论】:

      • 此功能已弃用,还有其他类似的解决方案吗?
      • @Jyotirmay matplotlib 中的保持函数没有任何用途,因此已被弃用。 pyplot 总是表现得好像 hold 无论如何都设置为 True。
      【解决方案5】:

      只需在最后拨打plt.show()

      import numpy as np
      import matplotlib.pyplot as plt
      
      plt.axis([0,50,60,80])
      for i in np.arange(1,5):
          z = 68 + 4 * np.random.randn(50)
          zm = np.cumsum(z) / range(1,len(z)+1)
          plt.plot(zm)    
      
      n = np.arange(1,51)
      su = 68 + 4 / np.sqrt(n)
      sl = 68 - 4 / np.sqrt(n)
      
      plt.plot(n,su,n,sl)
      
      plt.show()
      

      【讨论】:

      • 注意:这在命令行交互式输入的情况下不起作用。如果在脚本中运行,则可以正常工作。
      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多