Matplotlib制作若干图形并使用箭头更改-Python

Matplotlib制作若干图形并使用箭头更改-Python,python,matplotlib,graphic,Python,Matplotlib,Graphic,我有一篇课文,我想在每个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()

我有一篇课文,我想在每个
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
它返回给我这个:

我想说的是,我想使用窗口顶部的箭头将一个图形切换到另一个图形。这可能吗


例如,我有一篇有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为后端定义了一个模糊的接口来实现。此接口是下面的类
NavigationToolbar2
(;可能的linux源目录:/usr/lib/python3/dist packages/matplotlib/backend_base.py)。此接口使用
cbook
中类型为
stack
\u nav\u stack
对象。此堆栈保存有关不同平移信息的信息,当发生更改时,工具栏调用函数
\u update\u view
并重新绘制画布。通过创建我们自己的
堆栈
,向工具栏提供(代理)它,并覆盖
\u update\u 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()

以前,我修改了按钮的一些基类,但从那以后,我学习了python的一些面向对象技术,发现这是一个更好的解决方案。

谢谢,这正是我所需要的!根据maplotlib后端的不同,对
children()
的调用会有所不同。例如,使用
tkinter
,要调用的右函数是
winfo_children()
实际上,使用
tkinter
后端无法调用
左按钮.clicked.connect(…)
@MaxNoe,你在使用哪个后端?我想这是qt后端我复制粘贴上面的代码,事实上,我有:'NavigationIPy'对象没有属性'children'。所以现在我想知道我是否可以更改这行代码使其工作?或者如果不幸的是,我不得不经历更广泛的变化。我使用的是Jupyter经典笔记本电脑、python 3、windows 10、致以问候。