花了时间, 记录一下
# -*- 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()