M!Gu3L Posted November 26, 2011 at 02:58 AM Report #422937 Posted November 26, 2011 at 02:58 AM 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 😉
pedrotuga Posted November 26, 2011 at 03:06 AM Report #422938 Posted November 26, 2011 at 03:06 AM Conseguiste explicar bem sim. Mas ninguem vai fazer o teu trabalho de casa por ti. Se tiveres dúvidas, isso é outra coisa. http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.bar :rtfm:
M!Gu3L Posted November 26, 2011 at 03:25 AM Author Report #422940 Posted November 26, 2011 at 03:25 AM 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...
Pedro C. Posted November 26, 2011 at 04:05 PM Report #422986 Posted November 26, 2011 at 04:05 PM 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.
M!Gu3L Posted November 26, 2011 at 04:54 PM Author Report #422995 Posted November 26, 2011 at 04:54 PM É 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á. . 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
M!Gu3L Posted November 27, 2011 at 04:31 AM Author Report #423073 Posted November 27, 2011 at 04:31 AM 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... 🙂
Pedro C. Posted November 27, 2011 at 03:32 PM Report #423096 Posted November 27, 2011 at 03:32 PM 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.
M!Gu3L Posted November 27, 2011 at 04:03 PM Author Report #423099 Posted November 27, 2011 at 04:03 PM 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
M!Gu3L Posted November 27, 2011 at 05:09 PM Author Report #423109 Posted November 27, 2011 at 05:09 PM Ok, situação resolvida!!! 😉 Se surgirem mais duvidas, voltarei.. 🙂 Muito obrigado pela atenção. Cumprimentos Miguel Nobre
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now