zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    free pascal dialect
    free pascal
    free pascal
    跳槽后在新公司的一点感悟
    安全攻防技能30讲
    设计模式之美(二)——设计模式
    设计模式之美(一)——设计原则、规范与重构
    数据结构和算法躬行记(8)——动态规划
    倾斜摄影实景三维在智慧工厂 Web 3D GIS 数字孪生应用
    智慧文旅促进旅游业发展,可视化带你云游武夷
  • 原文地址:https://www.cnblogs.com/bregman/p/11205381.html
Copyright © 2011-2022 走看看