Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
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.
Mensajes: 1.052
Temas: 3
Registro en: Feb 2016
Reputación:
65
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!
Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
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
Mensajes: 1.052
Temas: 3
Registro en: Feb 2016
Reputación:
65
28-05-2018, 07:46 PM
(Última modificación: 28-05-2018, 07:46 PM por Francisco.)
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í.
Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
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!!
Mensajes: 1.052
Temas: 3
Registro en: Feb 2016
Reputación:
65
29-05-2018, 02:34 PM
(Última modificación: 29-05-2018, 02:35 PM por Francisco.)
Bien, adaptando tu código con el ejemplo podría resultar algo como lo siguiente.
#!/usr/bin/env python # -*- coding: utf-8 -*- import matplotlib as mpl import numpy as np import sys if sys.version_info[0] < 3: import Tkinter as tk else: import tkinter as tk from matplotlib import pyplot as plt import matplotlib.backends.tkagg as tkagg from matplotlib.backends.backend_agg import FigureCanvasAgg def draw_figure(canvas, figure, loc=(0, 0)): """ Draw a matplotlib figure onto a Tk canvas loc: location of top-left corner of figure on canvas in pixels. Inspired by matplotlib source: lib/matplotlib/backends/backend_tkagg.py """ figure_canvas_agg = FigureCanvasAgg(figure) figure_canvas_agg.draw() figure_x, figure_y, figure_w, figure_h = figure.bbox.bounds figure_w, figure_h = int(figure_w), int(figure_h) photo = tk.PhotoImage(master=canvas, width=figure_w, height=figure_h) # Position: convert from top-left anchor to center anchor canvas.create_image(loc[0] + figure_w/2, loc[1] + figure_h/2, image=photo) # Unfortunately, there's no accessor for the pointer to the native renderer tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2) # Return a handle which contains a reference to the photo object # which must be kept live or else the picture disappears return photo def loadGrafic(): # Fixing random state for reproducibility np.random.seed(19680801) mpl.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') return fig # Create a canvas w, h = 700, 500 window = tk.Tk() window.title("A figure in a canvas") canvas = tk.Canvas(window, width=w, height=h) canvas.pack() fig = loadGrafic() fig_photo = draw_figure(canvas, fig) # Let Tk take over tk.mainloop()
Saludos!
Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
Bua muchisimas gracias Francisco, un saludooo
Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
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?
Mensajes: 1.052
Temas: 3
Registro en: Feb 2016
Reputación:
65
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.
Mensajes: 64
Temas: 28
Registro en: Apr 2018
Reputación:
0
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.
|