使用带有注释更改的 matplotlib 交互式条形图

Posted

技术标签:

【中文标题】使用带有注释更改的 matplotlib 交互式条形图【英文标题】:Interactive bar plot using matplotlib with annotation change 【发布时间】:2015-12-19 12:40:09 【问题描述】:

我正在尝试创建一个可以随滑块动态变化的水平条形图。我已经按照 matplotib 网站上的方法进行操作,它适用于 line 数据。 代码:

def interactive_pyramid(ages_matrix, year_labels):
    fig, axs = plt.subplots()
    plt.subplots_adjust(bottom=0.25)
    l, = axs.plot(range(len(ages_matrix[0, :])), ages_matrix[0, :])
    axs.annotate(year_labels[0], xy=(0.85, 0.85), xycoords="axes fraction")
    axs.set_ylim([0,800])

    pprint (dir(axs))
    axcolor = 'lightgoldenrodyellow'
    axyear = plt.axes([0.25, 0.1, 0.5, 0.1], axisbg=axcolor)
    syear = Slider(axyear, 'Year', 0, ages_matrix.shape[0] - 1, 0)

    def update(val):
        year = syear.val
        # axs.barh(range(len(ages_matrix[0, :])), ages_matrix[val, :])
        l.set_ydata(ages_matrix[val, :])
        # axs.annotate(year_labels[year], xy=(0.85, 0.85), xycoords="axes fraction")
        axs.Annotation.remove()
        fig.canvas.draw()
    syear.on_changed(update)

ages_matrix 是 2d ndarray,year_labels 是 1d ndarray

两个主要问题:

axs.barh() 不使用set_ydata() 方法返回对象,我不能更改y 数据。如果我只是在 axs 对象上再次绘制数据,它不会删除以前的信息,从而导致图表混乱。 注释也是如此 - 它不会删除前一个。

有什么方法可以有效地擦除斧头并重新绘制它?也许有什么方法可以刷新画布?

【问题讨论】:

您需要在Annotation 对象的实例上调用remove。 barh 返回一个矩形列表,现在您必须单独更改它们的每个高度。 谢谢,有点帮助。认为它会更优雅。 【参考方案1】:

这就是我想出的:

# Init Chart
fig, axs = plt.subplots()
plt.subplots_adjust(bottom=0.25)
axs.set_xlim([0,ages_matrix.max()*1.05])
# Initial Pyramid
pyramid = axs.barh(np.arange(len(ages_matrix[0, :])) * 5,
                   ages_matrix[0, :],
                   height=4.5)
# Annotation
ann = axs.annotate(year_labels[0], xy=(0.85, 0.85), xycoords="axes fraction")
# Slider
axcolor = 'lightgoldenrodyellow'
axyear = plt.axes([0.25, 0.1, 0.5, 0.1], axisbg=axcolor)
syear = Slider(axyear, 'Year', 0, ages_matrix.shape[0] - 1, 0)

def update(val):
    t = syear.val
    year = np.trunc(year_labels[t])
    day = (year_labels[t] - year) * 365
    ages = ages_matrix[t, :]
    for i, p in enumerate(pyramid):
        p.set_width(ages[i])
    ann.set_text("Year: \nDay: ".format(int(year), int(day)))
    fig.canvas.draw()

【讨论】:

以上是关于使用带有注释更改的 matplotlib 交互式条形图的主要内容,如果未能解决你的问题,请参考以下文章

保存绘图时更改Matplotlib图窗口的分辨率?

如何更改 Matplotlib 中颜色条刻度标签的字体大小?

Python / Matplotlib:带有contourf的颜色条不尊重自定义cmap的刻度标签

Python matplotlib更改超出颜色条范围的值的默认颜色

在 matplotlib 中更改颜色条的字体大小

Google Colab 中的交互式 matplotlib 人物