Python Matplotlib使用滑块滚动图表时更新图表的更有效方法?

Python Matplotlib使用滑块滚动图表时更新图表的更有效方法?,python,matplotlib,slider,Python,Matplotlib,Slider,我希望能够滚动浏览一个冗长的图表。是否有比每次滚动条移动时清除轴并重新打印整个内容更有效/更快的方法 import matplotlib.pyplot as plt from matplotlib.widgets import Slider import random x=[c for c in range(300)] y=[random.randint(1,10) for c in range(300)] showbars=100 fig = plt.figure() ax = plt.s

我希望能够滚动浏览一个冗长的图表。是否有比每次滚动条移动时清除轴并重新打印整个内容更有效/更快的方法

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import random
x=[c for c in range(300)]
y=[random.randint(1,10) for c in range(300)]

showbars=100

fig = plt.figure()
ax = plt.subplot(111)
ax.bar(x[:showbars],y[:showbars])

def slidebar(pos):
    pos = int(pos)
    ax.clear()
    ax.bar(x[pos:pos+showbars],y[pos:pos+showbars])

slidebarpos = plt.axes([0.1, 0.01, 0.5, 0.03], facecolor="skyblue")
slider = Slider(slidebarpos, '', 0, len(x)-showbars, valinit=0)
slider.on_changed(slidebar)
slidebar(0)

plt.show()

这在我的计算机上很慢

首先,您只能绘制一次条形图,并使用滑块仅更改显示的范围,即x轴的限制

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import numpy as np

x=np.arange(300)
y=np.random.randint(1,10, size=300)

showbars=100

fig, ax = plt.subplots()

ax.bar(x,y)

def slidebar(pos):
    ax.set_xlim(pos-1, pos+showbars+1)

slidebarpos = plt.axes([0.1, 0.01, 0.5, 0.03], facecolor="skyblue")
slider = Slider(slidebarpos, '', 0, len(x)-showbars, valinit=0)
slider.on_changed(slidebar)
slidebar(0)

plt.show()
你也可以保持同一个条的位置,但改变它们的高度,伪造记号和标签,使这些条看起来像是在更新

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
from matplotlib.ticker import AutoLocator
import numpy as np

x=np.arange(300)
y=np.random.randint(1,10, size=300)

showbars=100

fig, ax = plt.subplots()

bars = ax.bar(x[:showbars],y[:showbars])

loc = AutoLocator()

def slidebar(pos):
    pos = int(pos)
    for bar, yi in zip(bars, y[pos:showbars+pos]):
        bar.set_height(yi)
    ticks = loc.tick_values(pos, showbars+pos)
    ax.set_xticks(ticks-pos)
    ax.set_xticklabels(ticks)

slidebarpos = plt.axes([0.1, 0.01, 0.5, 0.03], facecolor="skyblue")
slider = Slider(slidebarpos, '', 0, len(x)-showbars, valinit=0)
slider.on_changed(slidebar)
slidebar(0)

plt.show()

两种解决方案都明显比我发布的快,但哪种方法最快?