Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fab1904

[Resolvido] pylab plot

Recommended Posts

fab1904

Bom dia

Quando queremos fazer um gráfico como pylab e a funçao plot inicialmente passamos as abissas e ordenadas em listas mas quando passamos uma lista de nomos ele dá erro a converter para float como é que pudemos contornar este problema?

Desde já Obrigado

Share this post


Link to post
Share on other sites
pwseo

fab1904,

O erro acontece porque uma lista de nomes não é uma lista de números e, como deves imaginar, a função plot() está habituada a utilizar números para definir as coordenadas.

Provavelmente estás a tentar criar um gráfico de barras com a contagem de cada um dos nomes, e nesse caso o que deves passar são as contagens propriamente ditas, e não os nomes.

Outra coisa: tens colegas teus a discutir este problema neste fórum, uma das quais refere já ter conseguido resolver o problema. Já deste uma olhadela?

Share this post


Link to post
Share on other sites
fab1904

já li o tópico todo e não encontrei nenhuma informação sobre esta questão.

Como é obvio plot espera uma lista de números e não uma lista de nomes então comoé que eu faço para transformar os nomes em numero mas aparecerem na mesma os nomes?

Edited by fab1904

Share this post


Link to post
Share on other sites
pwseo

Já leste a documentação da função em questão? Já agora, no outro caso, o gráfico em questão era um gráfico de barras, pelo que o método relevante não é plot() mas sim bar().

Sugiro-te várias coisas: ler a documentação de bar(), set_xticks(), set_xticklabels() e procurar por exemplos da sua utilização (que tens no próprio site da matplotlib) -- isto porque os nomes nada têm a ver com os dados propriamente ditos (com as barras), mas sim apenas com os eixos (pois é no eixo das abcissas que é necessário mostrar os nomes, não é?)

Share this post


Link to post
Share on other sites
fab1904

sim.

    "must be length %d or scalar" % nbars)
ValueError: incompatible sizes: argument 'height' must be length 3 or scalar

Este erro aparece me quando faço uma barra com a altura maior que 1 se fizer duas barras com altura 1 faz tudo bem se fizer uma com altura maior que 1 já da esse erro não percebo porque.

Share this post


Link to post
Share on other sites
fab1904
def graficos(dados,atleta):
   f, (g1, g2) = pylab.subplots(1, 2)

   L_nomes=[]
   L_participacoes=[]
   largura=1
   abcissas=[]
   for i in range(len(dados)):
       L_nomes.append(dados[i][0])
       L_nomes=sorted(L_nomes)

   for j in range(len(L_nomes)):
       abcissas.append(L_nomes[j])
       abcissas[j]=j

   L_participacoes=participacoes(dados)

   g1.set_xticks(abcissas)
   g1.set_xticklabels(L_nomes)
   g1.bar(abcissas, L_participacoes)

Edited by pwseo
syntax highlight.

Share this post


Link to post
Share on other sites
pwseo

fab1904,

Experimentaste o código que escreveste passo-a-passo? Ou estás apenas a executar tudo e a constatar que não dá o resultado que pretendes?

Qual vai ser o resultado disto?

for i in range(len(dados)):
   L_nomes.append(dados[i][0])
   L_nomes=sorted(L_nomes)

E disto?

for j in range(len(L_nomes)):
   abcissas.append(L_nomes[j])
   abcissas[j]=j

E por fim, qual o valor de abcissas e de L_participacoes quando invocas g1.bar()?

PS.: volto a dizer que escrever ciclos com índices em Python é habitualmente má ideia.

Edited by pwseo
adicionada nota final

Share this post


Link to post
Share on other sites
fab1904

no primeiro são uma lista com os nomes ordenados

no segundo sai uma lista de 0 ate ao tamanho da lista dos nomes(provavelmente não é a melhor ideia mas foi so para experimentar não estou a ver como éque posso fazer)

abcissas =[0, 1, 2]

L_participacoes=[2, 1]

Share this post


Link to post
Share on other sites
pwseo

Não, não é isso que está a acontecer:

>>> abcissas
[0, 1, 2, 3, 4, 5, 6]

A menos que estejas a utilizar dados diferentes. Ainda assim, repara como tens listas de tamanho diferente para as abcissas e ordenadas.

Share this post


Link to post
Share on other sites
pwseo

fab1904, a função bar() precisa de 2 argumentos: o primeiro é uma lista com as abcissas onde começa cada barra, o segundo é uma lista com a ordenada (altura) de cada barra.

Portanto, se queres um gráfico com 2 barras, ambas as listas precisam de 2 elementos, se o gráfico tiver 4 barras, ambas as listas precisam de 4 elementos, e por aí fora. Logicamente, isto depende do número de participantes que tens.

Ja tens uma função participacoes() que te dá o número de participações e, portanto, a altura de cada barra. Pegando nessa lista, só tens que criar uma lista com as abcissas: começas em 0 e vais até ao número de barras - 1.

Mais que isto, só escrevendo o código por ti.

Share this post


Link to post
Share on other sites
fab1904

como éque eu posso alterar o eixo dos y esta a aparecer 0, 0.5, 1, 1.5 e queria que so aparecessem numero inteiro

Share this post


Link to post
Share on other sites
pwseo

Sugiro-te várias coisas: ler a documentação de bar(), set_xticks(), set_xticklabels() e procurar por exemplos da sua utilização (que tens no próprio site da matplotlib) (...)

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

×

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.