Ir para o conteúdo
fab1904

[Resolvido] pylab plot

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Editado por fab1904

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 é?)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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)

Editado por pwseo
syntax highlight.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por pwseo
adicionada nota final

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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]

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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) (...)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.