matplotlibインタラクティブデータカーソルmpldractursorの実現


概要mpldatacursorパケットは、matplotlibに対してインタラクティブなデータカーソル(ポップアップ注釈ボックス)を提供することができる。
その典型的な機能は:
  • グラフのデータ要素はテキストボックスをイジェクトして最近のデータ要素の座標値を表示します。
  • テキストボックスは、データカーソルの表示をキャンセルします。
  • dキーを押すと、データカーソルの表示/クローズが切り替わります。
  • 在这里插入图片描述 
    インストール
    matplotlibバージョンが3.3以下なら、直接pipでインストールできます。
    
    pip install mpldatacursor
    matplotlibバージョンが3.3以上の場合、pipのインストールは成功しましたが、実行例の場合はAttributeError: 'ScalarFormatter' object has no attribute 'pprint_val'エラーが発生します。
    ソースコードを調べて分かります。
    
    try:
      # Again, older versions of mpl
      return formatter.pprint_val(x)
    except AttributeError:
      # 3.3.0 or later
      return formatter.format_data_short(x)
    
    分析により、国内のpipソースを使用しているため、mpldatacursorパッケージはまだ修復されていない(pipにインストールされたmpldatacursorパッケージのバージョン番号は0.7.1)。
    そこで、https://github.com/joferkington/mpldatacursorを提案します。
    ソースをダウンロードし、ソースのインストール(mpldatacursorパッケージのバージョン番号は0.7.dev 0)を行います。
    
    python setup.py install
    基本アプリケーション(公式インスタンス)の解析
    アプリケーションの流れmpldatacursorパッケージの基本的なアプリケーションは簡単です。
  • は、mpldatacursorパケットからdatacursor関数を導入する。
  • アプリケーションdatacursor関数。
  •  パッケージ構造
    ソースを見ると、mpldatacursorパッケージの構造は以下の通りです。
    
    mpldatacursor
       convenience.py
       datacursor.py
       pick_info.py
       __init__.py
    datacursor関数定義はconvenience.pyにあり、datacursor関数の戻り値はDataCursorクラスの例である。DataCursorクラスはdatacursor.pyに定義されている。pick_info.pyは、DataCursorクラスの呼び出しのための一連のおよびポップアップテキストボックスに関する関数を定義する。
    datacursor関数定義datacursor関数によって定義されることは、
  • datacursor関数はパラメータを提供しないことができ、このように画像内のすべてのデータ要素がインタラクティブデータカーソルを適用する。
  • datacursor関数は、どのデータ要素がインタラクティブデータカーソルを適用するかを指定できます。
  • 
    def datacursor(artists=None, axes=None, **kwargs):
      """
      Create an interactive data cursor for the specified artists or specified
      axes. The data cursor displays information about a selected artist in a
      "popup" annotation box.
    
      If a specific sequence of artists is given, only the specified artists will
      be interactively selectable. Otherwise, all manually-plotted artists in
      *axes* will be used (*axes* defaults to all axes in all figures).
    
      Parameters
      -----------
      artists : a matplotlib artist or sequence of artists, optional
        The artists to make selectable and display information for. If this is
        not specified, then all manually plotted artists in `axes` will be
        used.
      axes : a matplotlib axes of sequence of axes, optional
        The axes to selected artists from if a sequence of artists is not
        specified. If `axes` is not specified, then all available axes in all
        figures will be used.
      tolerance : number, optional
        The radius (in points) that the mouse click must be within to select
        the artist. Default: 5 points.
      formatter : callable, optional
        A function that accepts arbitrary kwargs and returns a string that will
        be displayed with annotate. Often, it is convienent to pass in the
        format method of a template string, e.g.
        ``formatter="{label}".format``.
        Keyword arguments passed in to the `formatter` function:
          `x`, `y` : floats
            The x and y data coordinates of the clicked point
          `event` : a matplotlib ``PickEvent``
            The pick event that was fired (note that the selected
            artist can be accessed through ``event.artist``).
          `label` : string or None
            The legend label of the selected artist.
          `ind` : list of ints or None
            If the artist has "subitems" (e.g. points in a scatter or
            line plot), this will be a list of the item(s) that were
            clicked on. If the artist does not have "subitems", this
            will be None. Note that this is always a list, even when
            a single item is selected.
        Some selected artists may supply additional keyword arguments that
        are not always present, for example:
          `z` : number
            The "z" (usually color or array) value, if present. For an
            ``AxesImage`` (as created by ``imshow``), this will be the
            uninterpolated array value at the point clicked. For a
            ``PathCollection`` (as created by ``scatter``) this will be the
            "c" value if an array was passed to "c".
          `i`, `j` : ints
            The row, column indicies of the selected point for an
            ``AxesImage`` (as created by ``imshow``)
          `s` : number
            The size of the selected item in a ``PathCollection`` if a size
            array is specified.
          `c` : number
            The array value displayed as color for a ``PathCollection``
            if a "c" array is specified (identical to "z").
          `point_label` : list
            If `point_labels` is given when the data cursor is initialized
            and the artist has "subitems", this will be a list of the items
            of `point_labels` that correspond to the selected artists.
            Note that this is always a list, even when a single artist is
            selected.
          `width`, `height`, `top`, `bottom` : numbers
            The parameters for ``Rectangle`` artists (e.g. bar plots).
      point_labels : sequence or dict, optional
        For artists with "subitems" (e.g. Line2D's), the item(s) of
        `point_labels` corresponding to the selected "subitems" of the artist
        will be passed into the formatter function as the "point_label" kwarg.
        If a single sequence is given, it will be used for all artists with
        "subitems". Alternatively, a dict of artist:sequence pairs may be given
        to match an artist to the correct series of point labels.
      display : {"one-per-axes", "single", "multiple"}, optional
        Controls whether more than one annotation box will be shown.
        Default: "one-per-axes"
      draggable : boolean, optional
        Controls whether or not the annotation box will be interactively
        draggable to a new location after being displayed. Defaults to False.
      hover : boolean, optional
        If True, the datacursor will "pop up" when the mouse hovers over an
        artist. Defaults to False. Enabling hover also sets
        `display="single"` and `draggable=False`.
      props_override : function, optional
        If specified, this function customizes the parameters passed into the
        formatter function and the x, y location that the datacursor "pop up"
        "points" to. This is often useful to make the annotation "point" to a
        specific side or corner of an artist, regardless of the position
        clicked. The function is passed the same kwargs as the `formatter`
        function and is expected to return a dict with at least the keys "x"
        and "y" (and probably several others).
        Expected call signature: `props_dict = props_override(**kwargs)`
      keybindings : boolean or dict, optional
        By default, the keys "d" and "t" will be bound to deleting/hiding all
        annotation boxes and toggling interactivity for datacursors,
        respectively. If keybindings is False, the ability to hide/toggle
        datacursors interactively will be disabled. Alternatively, a dict of
        the form {'hide':'somekey', 'toggle':'somekey'} may specified to
        customize the keyboard shortcuts.
      date_format : string, optional
        The strftime-style formatting string for dates. Used only if the x or y
        axes have been set to display dates. Defaults to "%x %X".
      display_button: int, optional
        The mouse button that will triggers displaying an annotation box.
        Defaults to 1, for left-clicking. (Common options are 1:left-click,
        2:middle-click, 3:right-click)
      hide_button: int or None, optional
        The mouse button that triggers hiding the selected annotation box.
        Defaults to 3, for right-clicking. (Common options are 1:left-click,
        2:middle-click, 3:right-click, None:hiding disabled)
      keep_inside : boolean, optional
        Whether or not to adjust the x,y offset to keep the text box inside the
        figure. This option has no effect on draggable datacursors. Defaults to
        True. Note: Currently disabled on OSX and NbAgg/notebook backends.
      **kwargs : additional keyword arguments, optional
        Additional keyword arguments are passed on to annotate.
    
      Returns
      -------
      dc : A ``mpldatacursor.DataCursor`` instance
      """
    
    公式ソースコード
    
    import matplotlib.pyplot as plt
    import numpy as np
    from mpldatacursor import datacursor
    
    data = np.outer(range(10), range(1, 5))
    
    fig, ax = plt.subplots()
    lines = ax.plot(data)
    ax.set_title('Click somewhere on a line')
    
    datacursor()
    
    plt.show()
    
    あるデータ要素だけを定義して、対話式カーソルを使用します。
    本例では、2つのデータ要素(artist)があります。line1line2と、datacursor(line1)の関数はパラメータline1を提供しています。したがって、line1だけが対話式データカーソルを使用でき、line2は効果がありません。
    
    import matplotlib.pyplot as plt
    import numpy as np
    from mpldatacursor import datacursor
    fig, ax = plt.subplots()
    line1 = ax.plot([1,3])
    line2 = ax.plot([1,2])
    ax.set_title('Click somewhere on a line')
    datacursor(line1)
    plt.show()
    
    在这里插入图片描述
    その他の公式機能の概要mpldatacursorは多くの実際例を提供しており、詳細はhttps://github.com/joferkington/mpldatacursor/tree/master/examplesを参照してください。いちいち分析しないで、簡単に機能を説明します。
  • basic_single_annotation.py:多サブ図の場合、デフォルトの各サブ図のデータカーソルは独立しています。すなわち、各サブ図はデータカーソルを表示してもよく、相互に影響はありません。datacursor(display='single')パラメータを使用すると、現在のサブ図だけにデータカーソルが表示され、その余白図に表示されているデータカーソルは自動的に閉じられます。
  • change_popup_color.py:2つのケースを提供し、一つは提示枠の外枠をキャンセルし、一つは提示枠の背景色を白に変更する。
  • hover_example.py:データカーソルのトリガー方式をマウスの左クリックからマウスの浮遊に変えます。
  • show_artist_labels.py:データカーソルのデフォルト表示の座標値をデータ要素のlabelに変更する。
  • highlighting_example.py:データ要素をクリックすると、データ要素が明るく(黄色)表示されます。
  • draggable_example.py:複数のデータカーソルを同時に表示するサブ図。
  • customize_keyboard_shortcuts.py:データカーソルショートカットを再結合する。
  • labeled_points_example.py:カスタムデータポイントラベル。
  • date_example.py:日付データ表示。
  • bar_example.py:ヒストグラムにおいて、各柱の上にマウス懸濁トリガデータカーソルがある。
  • 締め括りをつけるmpldatacursorは長い歴史を持っていますが、matplotlib3.3の安定版を発表していません。ソースコードのインストールを提案します。mplcursorsは機能的にも非常に豊富であり、深度学習mpldatacursorと相互作用する事例としてもよい。
    ここでは、matplotlibインタラクティブデータカーソルmpldatacursorの実現に関する記事を紹介します。これまでの文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。