簡體   English   中英

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

它返回給我:

在此處輸入圖片說明

我的觀點是,我想使用窗口頂部的箭頭將一個圖形更改為另一個圖形。 這可能嗎?

例如,我有一個包含 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類( github 源代碼;可能的 linux 源代碼目錄:/usr/lib/python3/dist-packages/matplotlib/backend_bases.py)。 此接口使用來自cbook Stack類型的_nav_stack對象。 該堆棧保留有關不同平移信息的信息,並且當發生變化時,工具欄會調用函數_update_view並重新_update_view畫布。 通過創建我們自己的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()

以前,我正在修改按鈕的一些基類,但從那時起我了解了一些 Python 的面向對象技術,並發現這是一個更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM