No muestra ni tampoco genera el grafico

15 views
Skip to first unread message

Devilsito

unread,
Feb 13, 2022, 10:42:11 PM2/13/22
to Django-es
Hola amigos:
En consola digito cada una de estas lineas:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
x = [1,9,3,5,4]
plt.pie(x)
plt.show()

y el grafico se muestra perfectamente. Sin embargo estas mismas líneas de código las pongo en una una función de vista (view) pero no visualiza el grafico y no se donde lo guarda. Esta es la función que prácticamente debería ejecutar lo mismo que en consola.

def graficos(request):
    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    path_static_img = "/static/img/"
    variable1 = 'Gráfico individual x ejecutivo(a)'
    logo2 = path_static_img+"logo_interplan.jpg"
    x = [1,9,3,5,4]
    plt.pie(x)
    plt.show()
    return HttpResponse("Deberia mostrar el grafico pero no lo mostró")

Probablemente estoy cometiendo un error del que aún no me he dado cuenta.
Agradezco desde ya vuestra ayuda.

Devilsito

  

Angel Alvarez

unread,
Feb 14, 2022, 10:41:55 AM2/14/22
to djan...@googlegroups.com
Yo genero el .png y luego lo muestro

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/343f9a93-fc95-4d6c-b06c-601d626f2332n%40googlegroups.com.


--
Angel C. Alvarez

Devilsito

unread,
Feb 14, 2022, 6:27:20 PM2/14/22
to Django-es
Angel, por lo que tu me señalas, yo debería sacar de mi código el  plt.show(), en consecuencia debería agregar un botón exclusivo en mi html de modo que mostrara aparte el grafico?.
Si es así, ¿tienes un ejemplo para abrir un la figura de un grafico con extension png ?

carlos

unread,
Feb 14, 2022, 6:28:02 PM2/14/22
to djan...@googlegroups.com
Hola mira este ejemplo

pero tambien puedes usar https://www.highcharts.com/demo
solo envia tus datos como te los pide el gráfico sea lista o diccionario y automaticamente te pone un menu para descargar en png, jpg y svg creo

saludos



--
att.
Carlos Rocha

Angel Alvarez

unread,
Feb 15, 2022, 7:47:41 AM2/15/22
to djan...@googlegroups.com
Si, te aclaro que no lo hice en django. solo hice un graficador muy simple para mostrar graficos de evolucion de una serie de pentest
Va el codigo:
======================================================
def draw_app(app, resp):
#pdb.set_trace()
fechas = []
alto = []
medio = []
bajo = []

for reg in resp:
fechas.append(reg[1])
alto.append(reg[3])
medio.append(reg[4])
bajo.append(reg[5])
plt.plot(fechas,alto,'ro-', label='Altas {}'.format(reg[3]))
plt.plot(fechas,medio,'yo-', label='Medias {}'.format(reg[4]))
plt.plot(fechas,bajo,'go-', label='Bajas {}'.format(reg[5]))
plt.title('Evolucion de Vulnerabilidades en {}'.format(app.replace('_',' ').title()))
plt.xlabel('Fechas')
plt.ylabel('Cantidad')
plt.xticks(fechas)
plt.legend()
plt.grid()
grafico = '{}.png'.format(app)
plt.savefig(grafico)
plt.close()
================================================================
Con esta funcion armo el grafico que lleva el nombre de la aplicacion
Y con esta armo el html
================================================================
def crea_pagina(lista_app):
     try:
         with open('index.html', 'w') as idx:
         idx.write('<html>\n')
         idx.write('  <header>\n')
         idx.write('    <body>\n')
         for app in lista_app:
         idx.write('      <p align="center"><img src ="{}.png"><b>      </p>\n'.format(app))
         idx.write('      <p align="center">Para ver los reportes presione <a href="reportes/{}">AQUI</a>\n      </p><br>'.format(app))
         idx.write('    </body>\n')
         idx.write('  </header>\n')
         idx.write('</html>\n')
     except:
         print('Hubo un error al generar el archivo index.html')

====================================================================

Espero te sirva



--
Angel C. Alvarez

Angel Alvarez

unread,
Feb 15, 2022, 7:53:15 AM2/15/22
to djan...@googlegroups.com
Aclaracion:
======================================================================
def draw_app(app, resp):
     #pdb.set_trace()
     fechas = []
     alto = []
     medio = []
     bajo = []

     for reg in resp:
          fechas.append(reg[1])
          alto.append(reg[3])
          medio.append(reg[4])
          bajo.append(reg[5])
     plt.plot(fechas,alto,'ro-', label='Altas {}'.format(reg[3]))
     plt.plot(fechas,medio,'yo-', label='Medias {}'.format(reg[4]))
     plt.plot(fechas,bajo,'go-', label='Bajas {}'.format(reg[5]))
     plt.title('Evolucion de Vulnerabilidades en {}'.format(app.replace('_',' ').title()))
     plt.xlabel('Fechas')
     plt.ylabel('Cantidad')
     plt.xticks(fechas)
     plt.legend()
     plt.grid()
     grafico = '{}.png'.format(app)
     plt.savefig(grafico)
     plt.close()
=================================================================
Me olvide de ordenarla, le faltaban los espacios

saludos
--
Angel C. Alvarez

Devilsito

unread,
Feb 16, 2022, 4:26:24 PM2/16/22
to Django-es
Te agradezco enormemente, la ayuda, pero lo que necesito es la solución en el ambiente Django específicamente. Como señalé en mi intervención original, el código allí descrito funciona perfectamente en la consola de Python. Entonces la pregunta es ¿por que lo mismo no funciona en una ambiente y en el otro no?

Angel Alvarez

unread,
Feb 17, 2022, 9:36:08 AM2/17/22
to djan...@googlegroups.com
posiblemente porque lo ejecutas en consola.  De todas maneras podes adaptarlo a django. Haces una vista que genere el jpg y devuelva la ruta donde lo almacenas, y haces un template que lo muestre




--
Angel C. Alvarez

Angel Alvarez

unread,
Feb 17, 2022, 9:57:48 AM2/17/22
to djan...@googlegroups.com
Perdón por la escasa explicación que te mande antes. Para ver una imagen en el browser tenes que bajarla del sitio donde se encuentra, por lo que tenes que salvarla cuando la generas.  El método show no te la la ruta donde se encuentra, posiblemente porque es algo interno a la clase, no se si me explico bien. Entonces tenes que salvarla en un directorio ( carpeta) y despues idear algun algoritmo que la elimine (por tiempo, por ej)
--
Angel C. Alvarez

Francisco Pandol

unread,
Feb 20, 2022, 5:52:00 AM2/20/22
to djan...@googlegroups.com
No te funciona porque tenes que pasar la data del grafico al template y ahi mostralo.
Si buscas "pyplot django" en google, el primer resultado te va a enseñar a hacerlo.



--
Francisco Pandol
Reply all
Reply to author
Forward
0 new messages