显示一个pyplot数字后隐藏线条

Son*_*lor 12 python matplotlib

我正在使用pyplot来显示最多30行的折线图.我想添加一种方法来快速显示和隐藏图表上的各个行.Pyplot有一个菜单,您可以在其中编辑行属性以更改颜色或样式,但是当您想要隐藏线条以隔离您感兴趣的行时,它会相当笨拙.理想情况下,我想使用图例上的复选框显示和隐藏线条.(类似于在Paint.Net等图像编辑器中显示和隐藏图层)我不确定这是否可以使用pyplot,因此我对其他模块开放,只要它们有点容易分发.

Joe*_*ton 23

如果您愿意,可以将回调连接到图例,这些图例会在点击时显示/隐藏线条.这里有一个简单的例子:http://matplotlib.org/examples/event_handling/legend_picking.html

这是一个"更高级"的例子,无需手动指定线条和图例标记的关系即可工作(还有一些其他功能).

import numpy as np
import matplotlib.pyplot as plt


def main():
    x = np.arange(10)
    fig, ax = plt.subplots()
    for i in range(1, 31):
        ax.plot(x, i * x, label=r'$y={}x$'.format(i))

    ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1),
              ncol=2, borderaxespad=0)
    fig.subplots_adjust(right=0.55)
    fig.suptitle('Right-click to hide all\nMiddle-click to show all',
                 va='top', size='large')

    leg = interactive_legend()
    return fig, ax, leg

def interactive_legend(ax=None):
    if ax is None:
        ax = plt.gca()
    if ax.legend_ is None:
        ax.legend()

    return InteractiveLegend(ax.get_legend())

class InteractiveLegend(object):
    def __init__(self, legend):
        self.legend = legend
        self.fig = legend.axes.figure

        self.lookup_artist, self.lookup_handle = self._build_lookups(legend)
        self._setup_connections()

        self.update()

    def _setup_connections(self):
        for artist in self.legend.texts + self.legend.legendHandles:
            artist.set_picker(10) # 10 points tolerance

        self.fig.canvas.mpl_connect('pick_event', self.on_pick)
        self.fig.canvas.mpl_connect('button_press_event', self.on_click)

    def _build_lookups(self, legend):
        labels = [t.get_text() for t in legend.texts]
        handles = legend.legendHandles
        label2handle = dict(zip(labels, handles))
        handle2text = dict(zip(handles, legend.texts))

        lookup_artist = {}
        lookup_handle = {}
        for artist in legend.axes.get_children():
            if artist.get_label() in labels:
                handle = label2handle[artist.get_label()]
                lookup_handle[artist] = handle
                lookup_artist[handle] = artist
                lookup_artist[handle2text[handle]] = artist

        lookup_handle.update(zip(handles, handles))
        lookup_handle.update(zip(legend.texts, handles))

        return lookup_artist, lookup_handle

    def on_pick(self, event):
        handle = event.artist
        if handle in self.lookup_artist:

            artist = self.lookup_artist[handle]
            artist.set_visible(not artist.get_visible())
            self.update()

    def on_click(self, event):
        if event.button == 3:
            visible = False
        elif event.button == 2:
            visible = True
        else:
            return

        for artist in self.lookup_artist.values():
            artist.set_visible(visible)
        self.update()

    def update(self):
        for artist in self.lookup_artist.values():
            handle = self.lookup_handle[artist]
            if artist.get_visible():
                handle.set_visible(True)
            else:
                handle.set_visible(False)
        self.fig.canvas.draw()

    def show(self):
        plt.show()

if __name__ == '__main__':
    fig, ax, leg = main()
    plt.show()
Run Code Online (Sandbox Code Playgroud)

这允许您单击图例项目以打开/关闭其相应的艺术家.例如,你可以从这个:

在此输入图像描述

对此:

在此输入图像描述

  • @Basj我工作,你只需要通过再次单击工具按钮(与平移相同)来**取消选择**放大镜工具。 (2认同)