Jump to content
Sign in to follow this  
M!Gu3L

[Resolvido] Grafico com Matplotlib

Recommended Posts

M!Gu3L

Boas pessoal,

Alguém sabe como fazer um gráfico de barras onde são dadas as coordenadas de X e Y e ele faz a intercepção?

Por exemplo:

ArrayX  = [ 2000, 2001, 2002, 2003 ]

ArrayY  = [ 120, 232, 200, 54 ]

Com estes dados deveria por o eixo do X num intervalo de 2000 a 2003 e o eixo dos Y entre 54 e 232.

E depois para cada cada posição dos array's fazia uma barra com as coordenadas, ex: ( ArrayX[0], ArrayY[0] ).

Espero ter conseguido explicar bem o objectivo.

Cumprimentos

Miguel Nobre  ;)

Share this post


Link to post
Share on other sites
M!Gu3L

Pois, tbm n queria que me fizessem o "trabalho de casa", já andei por ai, e ando um bocado perdido com isto porque nunca usei e é a 1ª vez que estou a programar em Python. A unica coisa que queria era que alguém, com mais conhecimentos que eu,  me indicasse da lista enorme de opções que que o Matplotlib disponibiliza qual é a que  faz o pretendido, para nao andar a perder tempo a explorar metodos que nao funcionam, assim focava-me so numa e explorava-a..

Agradeço o link disponibilizado, não era mais do que isso que estava a espera...

Share this post


Link to post
Share on other sites
Pedro C.

A documentação do matplotlib não é a melhor de facto e algumas operações não são de todo intuitivas. O que costumo fazer é ir à galeria do matplotlib (http://matplotlib.sourceforge.net/gallery.html) e escolher um exemplo que ache parecido ao que pretendo fazer (ao carregares nas imagens segue para uma página que trás o código utilizado para fazer o respectivo gráfico). Um exemplo que penso que é parecido com o que queres fazer é este: http://matplotlib.sourceforge.net/examples/api/barchart_demo.html

Tem algumas diferenças para o teu caso mas é adaptável. Experimenta o código seguinte numa folha de script para ver se é isto que pretendes:

import matplotlib.pyplot as plt
import numpy as np

ArrayY  = [ 120, 232, 200, 54 ]

tamanho_da_classe = 0.6     # isto e a largura da classe.
localizacao_das_labels=0.3  # isto e o sition onde devem estar as labels depois
                            # do inicio de cada classe.

# np.arange(4) = array([0, 1, 2, 3]) porque queres fazer quatro barras.
plt.bar(np.arange(4),ArrayY,tamanho_da_classe)
# agora estou a dar um nome a cada posicao do np.arange(4) com o ArrayX.
plt.xticks(np.arange(4)+localizacao_das_labels,('2000','2001','2002','2003'))
# Como os limites automaticos podem dar um mau efeito estou a inseri-los
# manualmente dizendo que quero o minimo do np.arange(4) e o maximo mais o 
# tamanho da classe com intervalo de visualizacao.
plt.xlim(np.arange(4).min(),np.arange(4).max()+tamanho_da_classe)
# Depois de ter editado tudo posso lancar o grafico.
plt.show()

Faz algumas experiências com as variáveis dentro deste código que rapidamente começas a perceber como funciona esta biblioteca. A partir daqui podes melhorar muito o aspecto do teu gráfico jogando com as cores, as transparências, possivelmente o tipo de barras, o fundo do gráfico, labels, títulos, etc.

Se tiveres mais dúvidas avisa. Boa sorte.

Share this post


Link to post
Share on other sites
M!Gu3L

É isso mesmo Pedro, muito obrigado.  ;)

Eu tinha este código:

ArrayX  = [ 2000, 2001, 2002, 2003 ]
ArrayY  = [ 120, 232, 200, 54 ]

plt.title("ESTiG", fontsize = 20)
plt.bar(ArrayX, ArrayY, 0.1 )
plt.xlabel("Year", fontsize = 15)
plt.ylim(0,500)

plt.ylabel("Number of teachers", fontsize = 15)
plt.xlim(2000, 2003)
#
#plt.show()

e ele já fazia o que queria, mas com uma apresentação muito pouco interessante.

Sinceramente com o exemplo dado no Matplotlib, acho que tambem nao chegava lá.  :wallbash:.

Desde já, ressalvo também a qualidade dos videos que tens no youtube, nomeadamente aos que se referem ao matplotlib (que foi os únicos que vi), foram uma boa ajuda, para conhcer mais acerca da biblioteca, mas fazer um grafico com estas caracteristicas que queria estava dificil..

Mais uma vez, muito obrigado pela tua boa vontade e disponibilidade.  ;)

Abraço

Miguel Nobre

Share this post


Link to post
Share on other sites
M!Gu3L

Há distinção em executar esse código para desenhar o gráfico num programa com interface gráfica, feita com wxPython?

Tenho o código a funcionar, se for num script só com esse código. Quando pego na função e meto num evento de um botão dessa aplicação gráfica, quando chega á linha plt.bar(...), ele gera erros, inclusive as linhas dos erros já são dento da própria biblioteca.

Os erros sao estes:

Traceback (most recent call last):
  File "/home/admin1/Shared/CPython_Project/Interface/GUI.py", line 619, in evt_btn_showGraphic
    drawGraphic(ArrayX, ArrayY)
  File "/home/admin1/Shared/CPython_Project/Interface/GUI.py", line 300, in drawGraphic
    plt.bar( np.arange( len( y ) ), y, barWidth )
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 1735, in bar
    ax = gca()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 582, in gca
    ax =  gcf().gca(**kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 276, in gcf
    return figure()
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 254, in figure
    **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 91, in new_figure_manager
    canvas = FigureCanvasTkAgg(figure, master=window)
  File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 159, in __init__
    self._tkcanvas.create_image(w/2, h/2, image=self._tkphoto)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2201, in create_image
    return self._create('image', args, kw)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2192, in _create
    *(args + self._options(cnf, kw))))
_tkinter.TclError: bad screen distance "320.0"

Esta situação ultrapassa-me por completo... :)

Share this post


Link to post
Share on other sites
Pedro C.

Estás a chamar uma janela do matplotlib ou estás a tentar que fique embutida no teu GUI? Se for o segundo caso é um processo com um bocadinho mais complexidade que o habitual (e tem várias limitações). Se for o primeiro caso, estás a chamar janelas já feitas do matplolib (que é o que o código que meteste no teu último post faz) ou estás a fazer a tua própria (geralmente tens que abrir uma figura nestes casos: fig=plt.figure() por exemplo)?

Independentemente da situação penso que o teu problema deverá vir de algum argumento incompatível com as funções do matplotlib ou estruturação incorrecta do código, isto porque já utilizei muitas vezes o matplolib juntamente com wxpython e foi raro ter problemas.

Experimenta pegar num código perfeitamente funcional do que queres plotar (inclusive os argumentos já definidos, como por exemplo o que já meteste aqui antes) e copia-o para onde queres o teu código matplotlib a funcionar no wx (suponho que seja a função evt_btn_showGraphic). Se correr assim (lembra-te de definir os argumentos dentro da função em que estás a testar) já sabes que o matplotlib está a correr nestas condições e que o teu problema é a passar variáveis ou outras coisas exteriores à biblioteca.

Se quiseres mete aqui o código do teu programa que fica mais fácil analisar e experimentar.

Share this post


Link to post
Share on other sites
M!Gu3L

Não, simplesmente queria que ao clicar no botão ele gerasse o gráfico na janela normal do matplotlib.

Este código funciona numa script á parte e quando copio este código para dentro do evento do botão, surgem esses erros todos quando ele o vai executar...

import numpy as np
import  matplotlib.pyplot as plt


y  = [ 120, 232, 200, 54, 10 ]
x= [ '2000','2001','2002','2003', '2004' ]

barWidth = 0.3
plt.bar( np.arange( len( y ) ), y, barWidth )
plt.xticks( np.arange( len( x ) ) + ( barWidth / 2 ), x )
plt.xlim( np.arange( len ( x ) ).min(), np.arange( len( x ) ).max() + barWidth)
plt.show()

Nota: Se repares nem é na linha do "plt.show()" que ele vai despoletar os erros, é mesmo quando ele vai desenhar o gráfico em memoria "plt.bar( .., ..., ... )".

Obrigado

Miguel Nobre

Share this post


Link to post
Share on other sites
M!Gu3L

Ok, situação resolvida!!!  ;)

Se surgirem mais duvidas, voltarei..  :)

Muito obrigado pela atenção.

Cumprimentos

Miguel Nobre

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.