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!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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í.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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.

Código:
#!/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!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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: 5 invitado(s)