如何在 matplotlib 中延长线条?

Posted

技术标签:

【中文标题】如何在 matplotlib 中延长线条?【英文标题】:How to extend lines in matplotlib? 【发布时间】:2022-01-24 01:40:06 【问题描述】:

我编写了一个动画类,它可以接受多行的 y 坐标,我想根据新数据动态扩展它。

问题是,即使我指定了线条标签,它似乎也没有将我的线条视为一个实例。相反,它将它们视为新行。

因此我每次都会得到新的线条颜色和图例:

除了在类中创建一个内部颜色数据库并根据行索引重用它们之外,还有什么方法可以解决此问题?

但我仍然不太喜欢它每次都将我的行视为新实例,我想知道是否有一个简单的解决方法。

import time
from matplotlib import pyplot as plt
import numpy as np

class Animator:
    def __init__(self):
        plt.ion()
        self.fig = plt.figure()
        self.x = 0
        self.Y = np.array([],dtype='object')
        
    def add(self, Y):
        if (self.Y.size == 0 ):
            self.Y = Y
        for i, y in enumerate(Y):
            plt.plot([self.x,self.x+1], [self.Y[i],y], label=f'linei+1')
        plt.legend()
        self.x+=1
        self.Y=Y
        self.fig.canvas.flush_events()
        
animator = Animator()   

y_vals = np.random.normal(scale=3,size=(10,3)).cumsum(axis=0)
for i in range(len(y_vals)):
    animator.add(y_vals[i])
    time.sleep(1)

【问题讨论】:

我不确定,但你不应该在冲洗前打电话给self.fig.canvas.draw()吗? 我在init中使用了ion()模式。 好的,更新循环中的值的缩进是否正确? 是的,使用不同类型的循环执行大量计算,然后在每个循环结束时吐出指标。有时可能需要一段时间,所以我需要查看实时数据。 好吧,正如您想象的那样,解决方案是:“在类中创建一个内部颜色数据库并根据行索引重用它们”。为什么你认为这不是一个好主意? 【参考方案1】:

也许它毕竟没有那么糟糕......你觉得呢?

class Animator:
    def __init__(self, style=('b-', 'm--', 'g-.', 'r:')):
        plt.ion()
        self.fig = plt.figure()
        self.x = 0
        self.Y = np.array([],dtype='object')
        self.fmts=lambda a: style[a%len(style)]
        
    def add(self, Y):
        if (self.Y.size == 0 ):
            self.Y = Y
        for i, y in enumerate(Y):
            plt.plot([self.x,self.x+1], [self.Y[i],y], self.fmts(i), label=f'linei+1')
        if (self.x==0):
            plt.legend(loc='upper left')
        self.x+=1
        self.Y=Y
        self.fig.canvas.flush_events()

【讨论】:

以上是关于如何在 matplotlib 中延长线条?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在matplotlib中循环使用线条样式吗

matplotlib动画在更新期间删除线条

如何删除 matplotlib 图例上的线条/标记?

在 python 和 matplotlib 中带有线条的地理数据图/地图

matplotlib - 使用线条剪辑图像

matplotlib(三)——标记、线条等设置。