Matplotlib 制作几个图形并使用箭头更改 - Python
Matplotlib make several graphics and use the arrow to change - Python
我有一段文字,我想每 n
个句子制作一个字母频率图形。我有这个代码来制作一个图形:
def graphic(dic):
x = list(range(len(dic)))
liste = []
valeur = []
for i in dic:
liste += [(dic[i],i)]
valeur += [dic[i]]
liste.sort()
liste.reverse()
valeur.sort()
valeur.reverse()
my_xticks = []
for i in liste:
my_xticks += i[1]
xticks(x, my_xticks)
plot(x,valeur); show()
return liste,valeur
它returns我这个:
我的观点是,我想使用 window 顶部的箭头将一个图形更改为另一个图形。这可能吗?
比如我有10个句子的文字,我想每1个句子做一个图形。所以,我将有 10 个图形,我希望能够使用箭头进行导航,但是当我只调用该函数两次时,它会在同一页上绘制 2 个图形。
您可以访问按钮并更改它们的回调:
import matplotlib.pyplot as plt
def callback_left_button(event):
''' this function gets called if we hit the left button'''
print('Left button pressed')
def callback_right_button(event):
''' this function gets called if we hit the left button'''
print('Right button pressed')
fig = plt.figure()
toolbar_elements = fig.canvas.toolbar.children()
left_button = toolbar_elements[6]
right_button = toolbar_elements[8]
left_button.clicked.connect(callback_left_button)
right_button.clicked.connect(callback_right_button)
这里有一种方法可以在不引用特定后端的情况下执行此操作(即它应该是可移植的)。这个想法是 matplotlib 定义了一个有点模糊的接口供后端实现。这个界面就是下面的classNavigationToolbar2
(github source;可能linux源码目录:/usr/lib/python3/dist-packages/matplotlib/backend_bases.py)。此接口使用来自 cbook
的 Stack
类型的 _nav_stack
对象。此堆栈保留有关不同平移信息的信息,并且当工具栏发生变化时调用函数 _update_view
并重绘 canvas。通过创建我们自己的 Stack
,将其提供(代理)到工具栏,并覆盖 _update_view
,我们可以让工具栏按照我们的意愿行事。
import matplotlib.backend_bases
import matplotlib.pyplot as plt
from numpy.random import random
# this is the data structure is used by NavigationToolbar2
# to switch between different pans. We'll make the figure's
# toolbar hold a proxy to such an object
from matplotlib.cbook import Stack
class StackProxy:
def __init__(self,stack):
self._stack = stack
def __call__(self):
return self._stack.__call__()
def __len__(self):
return self._stack.__len__()
def __getitem__(self,ind):
return self._stack.__getitem__(ind)
def nop(self): pass
# prevent modifying the stack
def __getattribute__(self,name):
if name == '_stack':
return object.__getattribute__(self,'_stack')
if name in ['push','clear','remove']:
return object.__getattribute__(self,'nop')
else:
return object.__getattribute__(self._stack,name)
stack = Stack()
for data in [[random(10),random(10)] for _ in range(5)]:
stack.push(data)
def redraw(*args):
plt.clf()
plt.scatter(*stack()) # stack() returns the currently pointed to item
plt.gcf().canvas.draw()
fig = plt.gcf()
toolbar = fig.canvas.toolbar
toolbar._update_view = redraw.__get__(toolbar)
stackProxy = StackProxy(stack)
toolbar._nav_stack = stackProxy
redraw()
plt.show()
以前,我修改了按钮的一些基础 classes,但从那以后我了解了 python 的一些面向对象的技术,并发现这是一个更好的解决方案。
我有一段文字,我想每 n
个句子制作一个字母频率图形。我有这个代码来制作一个图形:
def graphic(dic):
x = list(range(len(dic)))
liste = []
valeur = []
for i in dic:
liste += [(dic[i],i)]
valeur += [dic[i]]
liste.sort()
liste.reverse()
valeur.sort()
valeur.reverse()
my_xticks = []
for i in liste:
my_xticks += i[1]
xticks(x, my_xticks)
plot(x,valeur); show()
return liste,valeur
它returns我这个:
我的观点是,我想使用 window 顶部的箭头将一个图形更改为另一个图形。这可能吗?
比如我有10个句子的文字,我想每1个句子做一个图形。所以,我将有 10 个图形,我希望能够使用箭头进行导航,但是当我只调用该函数两次时,它会在同一页上绘制 2 个图形。
您可以访问按钮并更改它们的回调:
import matplotlib.pyplot as plt
def callback_left_button(event):
''' this function gets called if we hit the left button'''
print('Left button pressed')
def callback_right_button(event):
''' this function gets called if we hit the left button'''
print('Right button pressed')
fig = plt.figure()
toolbar_elements = fig.canvas.toolbar.children()
left_button = toolbar_elements[6]
right_button = toolbar_elements[8]
left_button.clicked.connect(callback_left_button)
right_button.clicked.connect(callback_right_button)
这里有一种方法可以在不引用特定后端的情况下执行此操作(即它应该是可移植的)。这个想法是 matplotlib 定义了一个有点模糊的接口供后端实现。这个界面就是下面的classNavigationToolbar2
(github source;可能linux源码目录:/usr/lib/python3/dist-packages/matplotlib/backend_bases.py)。此接口使用来自 cbook
的 Stack
类型的 _nav_stack
对象。此堆栈保留有关不同平移信息的信息,并且当工具栏发生变化时调用函数 _update_view
并重绘 canvas。通过创建我们自己的 Stack
,将其提供(代理)到工具栏,并覆盖 _update_view
,我们可以让工具栏按照我们的意愿行事。
import matplotlib.backend_bases
import matplotlib.pyplot as plt
from numpy.random import random
# this is the data structure is used by NavigationToolbar2
# to switch between different pans. We'll make the figure's
# toolbar hold a proxy to such an object
from matplotlib.cbook import Stack
class StackProxy:
def __init__(self,stack):
self._stack = stack
def __call__(self):
return self._stack.__call__()
def __len__(self):
return self._stack.__len__()
def __getitem__(self,ind):
return self._stack.__getitem__(ind)
def nop(self): pass
# prevent modifying the stack
def __getattribute__(self,name):
if name == '_stack':
return object.__getattribute__(self,'_stack')
if name in ['push','clear','remove']:
return object.__getattribute__(self,'nop')
else:
return object.__getattribute__(self._stack,name)
stack = Stack()
for data in [[random(10),random(10)] for _ in range(5)]:
stack.push(data)
def redraw(*args):
plt.clf()
plt.scatter(*stack()) # stack() returns the currently pointed to item
plt.gcf().canvas.draw()
fig = plt.gcf()
toolbar = fig.canvas.toolbar
toolbar._update_view = redraw.__get__(toolbar)
stackProxy = StackProxy(stack)
toolbar._nav_stack = stackProxy
redraw()
plt.show()
以前,我修改了按钮的一些基础 classes,但从那以后我了解了 python 的一些面向对象的技术,并发现这是一个更好的解决方案。