【问题标题】:Adding plots to different figures using matplotlib使用 matplotlib 将绘图添加到不同的图形
【发布时间】:2020-03-16 09:43:50
【问题描述】:

出于特定目的,我想使用matplotlib 绘制 2-3 个不同的图形,并为每个图形添加不同的图形。我的特殊要求很复杂,很难解释,所以我会尝试用一个更简单的例子来解释。

例如,假设我有一个信号列表,称为 [signal_1,signal_2,signal_3, .... , signal _40] 其中每个“signal_XXX”代表一个 numpy 数组,一些长度为 5000,另一些长度为 10,000。

我想将所有这些信号绘制在 2 个不同的图表中,具体取决于它们的长度。

import matplotlib.pyplot as plt
my_signals = [ signal_1,signal_2,....,signal_40]

fig_5000 = plt.figure(1)

fig_10000 = plt.figure(2)

for signal_i in my_signals :
    if len(signal_i) == 5000 :
        fig_5000.plot(signal_i)
    if len(signal_i) == 10000 :
        fig_10000.plot(signal_i)

# now I want to individually show these 2 figures
fig_5000.show()
" do something else here "
fig_10000.show()

显然我写的代码不会工作,如果我使用最后一部分 plt.show() 两个图表会同时显示,这是我不想要的。

有什么方法可以使用 matplotlib 做我想做的事情吗?还是我应该尝试其他方法?

编辑

在 Diziet Asahi 的建议下,我包含了一个“工作”代码,

import numpy
import matplotlib.pyplot as plt
my_signals = []
for i in range (0,25):
    if i//2 == 0 :
        my_signals.append( numpy.random.rand(100))
    if i//2 == 1 :
        my_signals.append( numpy.random.rand(200))
"""numpy.random.rand craetes an array with random numbers of the given shape.
now we have  a list of 50 arrays with 100 and 200 lengths """

fig_100 = plt.figure(1)
ax100 = fig_100.add_subplot(111)
plt.title(" length = 100")
fig_200 = plt.figure(2)
plt.title(" length = 200")
ax200 = fig_200.add_subplot(111)


for arrayzz in my_signals :
    if len(arrayzz) == 100 :
        ax100.plot(arrayzz)
    if len(arrayzz) == 200:
        ax200.plot(arrayzz)

plt.show()

这解决了前面问题的第一部分。不过,我无法单独展示它们。

【问题讨论】:

标签: python matplotlib


【解决方案1】:

除了创建图形,您还需要创建。您没有说是否希望所有信号都在同一轴上,但通常这应该可以解决问题:

import matplotlib.pyplot as plt
my_signals = [ signal_1,signal_2,....,signal_40]

fig_5000 = plt.figure(1)
ax_5000 = fig_5000.add_subplot(111)

fig_10000 = plt.figure(2)
ax_10000 = fig_10000.add_subplot(111)

for signal_i in my_signals :
    if len(signal_i) == 5000 :
        ax_5000.plot(signal_i)
    if len(signal_i) == 10000 :
        ax_10000.plot(signal_i)

plt.show()

【讨论】:

  • 嗨,谢谢你的回答解决了我问题的第一部分。你能告诉我如何一一显示这两个数字吗? plt.show() 将同时绘制两个数字...
  • 对于看到subplot 被使用而感到困惑的任何人,让我通知您,这些数字被绘制在两个单独的窗口中。
【解决方案2】:

目前没有很好的解决方案。 plt.show() 显示所有打开的 pyplot 图形。你当然可以关闭任何问题,本质上和this one一样,当然也可以为图写自己的GUI,随时显示是可能的,但是比较麻烦。

有一个想法可以在未来的版本中增强show 功能,请参阅https://github.com/matplotlib/matplotlib/pull/14024,但目前的解决方案是

import numpy
import matplotlib.pyplot as plt

def reshow(fig):
    import importlib
    import matplotlib.backends
    import matplotlib.backend_bases
    backend_mod = importlib.import_module(f"matplotlib.backends.backend_{plt.get_backend().lower()}")
    Backend = type("Backend", (matplotlib.backends._Backend,), vars(backend_mod))
    fm = Backend.new_figure_manager_given_figure(1, fig)
    matplotlib.backend_bases.Gcf.set_active(fm)
    plt.show()


my_signals = []
for i in range (0,25):
    if i//2 == 0 :
        my_signals.append( numpy.random.rand(100))
    if i//2 == 1 :
        my_signals.append( numpy.random.rand(200))


fig_100 = plt.figure(1)
ax100 = fig_100.add_subplot(111)
ax100.set_title(" length = 100")

fig_200 = plt.figure(2)
ax200 = fig_200.add_subplot(111)
ax200.set_title(" length = 200")

for arrayzz in my_signals :
    if len(arrayzz) == 100 :
        ax100.plot(arrayzz)
    if len(arrayzz) == 200:
        ax200.plot(arrayzz)

# First close all figures
plt.close("all")
#Then (re)show a single figure
reshow(fig_100)
# and the other one
reshow(fig_200)

【讨论】:

  • 您好,当我尝试执行您的代码时,出现以下错误。 ImportError: No module named backend_{plt.get_backend().lower()}
  • 哦,你用的是哪个python版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多