python交互图

花了时间, 记录一下

# -*- coding:utf-8 -*-
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
 

class BarBrowser(object): 
    def __init__(self, rects):
        self.xy = 0
        self.width = 0
        self.height = 0
        # 这里是为了让鼠标选中画板中的矩形,用来进行变色的。需要注意visible参数
        # visible是设置图形是否直接在画板进行显示的,如果设置为True,运行程序,
        # 则会直接进行显示。
        self.selected = ax.add_artist(
            Rectangle(rects[0].get_xy(),rects[0].get_width(),rects[0].get_height(), 
                    color='g', visible=False)
            )
        self._x = 0
        self._is_drawed = False
        self._is_called = False 
        self._map = {rect.xy[0]:rect.get_height()  for rect in rects}


    def motion(self, event):
        if event.ydata is None: 
            return True

        if self._is_called and self._is_drawed:
            self._is_called = False
            return True

        self.selected.set_height(event.ydata)
        fig.canvas.draw()

        self._map[self.xy[0]] = event.ydata
        self._is_called = False
        
        # 打印修正的结果
        #print(self._map)


    def _has_picked(self, event): 
        #  判断是否还在同一个bin内操作?
        _is_pick = event.artist.xy[0]==self._x
        self._x = event.artist.xy[0]        
        return _is_pick


    def enter_axes(self, event):
        # 选中一个bin, 标出绿色.        
        if not event.artist:
            return True
        
        self._is_called = True
        self._is_drawed = False
        if self._has_picked(event):
            return True

        # draw
        self.xy = event.artist.xy
        self.width = event.artist.get_width()
        self.height = event.artist.get_height()
    
        self.selected.set_visible(True)
        self.selected.set_xy(self.xy)
        self.selected.set_height(self.height)
        self.selected.set_alpha(0.7)
        fig.canvas.draw()
        # end draw
        self._is_drawed = True
 

if __name__ == '__main__':
    fig = plt.figure(figsize=(10, 8), dpi=100 )
    ax = fig.add_subplot(111)

    # 下面的两个变量是画板上要展示的数据 
    theyear = ['1m', '2m', '3m', '4m', '5m', '6m',
               '7m', '8m', '9m', '10m', '11m', '12m']

    peoplesum = [855, 770, 808, 793, 850, 795, 887, 909, 824, 879, 802, 827]

    xno = np.arange(len(theyear))

    # 绘制柱形图。这里需要注意picker属性,它决定了'pick_event'是否被激活
    # 取值可以是浮点型、布尔值或者函数。这里我们设置为True。
    rects = ax.bar(xno, peoplesum, picker=True)
    plt.xticks(xno, theyear)    # 设置x轴坐标

    browser = BarBrowser(rects)
    fig.canvas.mpl_connect('pick_event', browser.enter_axes)
    fig.canvas.mpl_connect('button_press_event', browser.motion)

    plt.show()
原文地址:https://www.cnblogs.com/bregman/p/11205381.html