Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Representar Grafico en Aplicacion de Escritorio
#1
Hola buenas, una vez mas acudo a este foro porque tengo una duda a la hora de representar un gráfico con python. He estado leyendo sobre la librería MATPLOTLIB y alguna otra mas, he generado gráficos pero me los muestra por la consola de iPython. Yo lo que quiero es coger ese gráfico y mostrarlo en una aplicación de escritorio, en un contenedor FRAME o algo por el estilo. Como podría hacerlo?

Gracias y un saludo.
Responder
#2
Hola! matplotlib provee varios adaptadores para incluir un gráfico en tu aplicación de escritorio. Aquí tienes un ejemplo para Qt y otro para Tk.

Saludos!
Responder
#3
Hola Francisco, estaba revisando el ejemplo para TK que me has pasado pero no termino de entender el código, parece que dibuja una linea y tal, no veo que trabaje con un gráfico. Igual me equivoco pero es que estoy un poco verde en este tema
Responder
#4
Alfredo, lo importante del código es la función draw_figure(), que toma como argumento un canvas de Tk y una figura de Matplotlib. Deberías poder usarlo como base para adaptarlo a tu gráfico. Si tienes problemas puedes pegar el código que genera tu gráfico aquí.
Responder
#5
def loadGrafic():
# Fixing random state for reproducibility
np.random.seed(19680801)

matplotlib.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
ax.set_title('Grafico de Prueba')
plt.savefig('graficaPrueba.png')


Ese es mi código, el tema es que yo el gráfico lo guardo en una imagen .png porque como no sabia mostrarlo pues busque ese recurso. Imagino que lo que tengo que hacer en vez de guardarlo como .png es crear una figura que es la que le pasaré después a la funcion drawFigure(). Gracias!!
Responder
#6
Bien, adaptando tu código con el ejemplo podría resultar algo como lo siguiente.

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import matplotlib as mpl
  5. import numpy as np
  6. import sys
  7. if sys.version_info[0] < 3:
  8. import Tkinter as tk
  9. else:
  10. import tkinter as tk
  11. from matplotlib import pyplot as plt
  12. import matplotlib.backends.tkagg as tkagg
  13. from matplotlib.backends.backend_agg import FigureCanvasAgg
  14.  
  15.  
  16. def draw_figure(canvas, figure, loc=(0, 0)):
  17. """ Draw a matplotlib figure onto a Tk canvas
  18.  
  19. loc: location of top-left corner of figure on canvas in pixels.
  20. Inspired by matplotlib source: lib/matplotlib/backends/backend_tkagg.py
  21. """
  22. figure_canvas_agg = FigureCanvasAgg(figure)
  23. figure_canvas_agg.draw()
  24. figure_x, figure_y, figure_w, figure_h = figure.bbox.bounds
  25. figure_w, figure_h = int(figure_w), int(figure_h)
  26. photo = tk.PhotoImage(master=canvas, width=figure_w, height=figure_h)
  27.  
  28. # Position: convert from top-left anchor to center anchor
  29. canvas.create_image(loc[0] + figure_w/2, loc[1] + figure_h/2, image=photo)
  30.  
  31. # Unfortunately, there's no accessor for the pointer to the native renderer
  32. tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2)
  33.  
  34. # Return a handle which contains a reference to the photo object
  35. # which must be kept live or else the picture disappears
  36. return photo
  37.  
  38.  
  39. def loadGrafic():
  40. # Fixing random state for reproducibility
  41. np.random.seed(19680801)
  42.  
  43. mpl.rcParams['axes.unicode_minus'] = False
  44. fig, ax = plt.subplots()
  45. ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
  46. ax.set_title('Grafico de Prueba')
  47. return fig
  48.  
  49.  
  50. # Create a canvas
  51. w, h = 700, 500
  52. window = tk.Tk()
  53. window.title("A figure in a canvas")
  54. canvas = tk.Canvas(window, width=w, height=h)
  55. canvas.pack()
  56.  
  57. fig = loadGrafic()
  58. fig_photo = draw_figure(canvas, fig)
  59.  
  60. # Let Tk take over
  61. tk.mainloop()


Saludos!
Responder
#7
Bua muchisimas gracias Francisco, un saludooo
Responder
#8
Buenas Francisco, esta función que me pasaste me estaba funcionando perfectamente pero dibuja el gráfico en un canvas con un tamaño y una posición fijos, como podría hacer que lo dibujara en un frame y dependiera del tamaño de este. Por ejemplo he creado algunas etiquetas con las propiedades "relwidth" y "relheight" y conforme hago grande o pequeña la ventana cambian de tamaño, se podría hacer algo parecido con el gráfico que dibujo en el canvas?
Responder
#9
Hola Alfredo. Dudo que eso sea posible, pues el gráfico no es sino una imagen. Habría que generar un nuevo gráfico cada vez que se modifique el tamaño de la ventana ─por más mínimo que sea─, lo cual traería problemas.

Podrías en su lugar crear un botón "Actualizar gráfico" que vuelva a generarlo según las dimensiones de la ventana.
Responder
#10
Y otra duda que tengo Francisco, en la función que dibuja el gráfico, como puedo cambiar el tamaño ancho y alto ??

Saludos, gracias.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)