Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dificuldade com gráfico de barras

Pessoal, estou com dificuldades com relação a distância das duas barras. Vou postar meu código. Alguém consegue me ajudar?

Além disso, se tiverem sugestões de como melhorar o código, agradeço, porque recém do começando nesse mundo dos plots :)

fig = plt.figure(figsize=(5,4))
eixo = fig.add_axes([0, 0, 1,1])

cores = ['steelblue', 'indianred']

plt.errorbar(['ZR14', 'ZR16'], tabelaZr, yerr=desvio, color='k', fmt='o', capsize=5)

eixo.bar(['ZR14', 'ZR16'], tabelaZr, color=cores, width=0.2)
eixo.set_title('Relação Zr nos dois revestimentos', fontsize = 15, pad = 7)
eixo.set_xlabel('Revestimento', fontsize = 12)
eixo.set_ylabel('%Zr', fontsize = 12)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Olá, Carolina, tudo bem?

Gostei bastante do seu código.

Como você apontou, sugeriria pequenas alterações para evitar repetições e vou pontuar um pouco mais abaixo junto a solução de sua dúvida. A respeito do espaçamento, podemos ajustar facilmente, por exemplo, das duas formas:

Pelo parâmetro width do método bar():

Nesse exemplo, apenas modificaremos o valor que você colocou de 0.2 para 0.6 o que aumentaria a largura de suas barras e reduziria essa lacuna entre elas.

Dessa forma, o seu código poderia seguir esse caminho:

fig = plt.figure(figsize=(5,4))
eixo = fig.add_axes([0, 0, 1, 1])

cores = ['steelblue', 'indianred']

# Passando sua lista para uma variável, evitando a repetição dela nos plots,
# o que garante que caso haja alguma alteração de uma das categorias ou acréscimo 
# de mais algumas não seria necessário modificar em cada lugar em que elas aparecem
revestimentos = ['ZR14', 'ZR16']

# Modificando o parâmtetro width de 0.2 para 0.6, neste exemplo
eixo.bar(revestimentos, tabelaZr, color=cores, width = 0.6, align='center')
eixo.errorbar(revestimentos, tabelaZr, yerr=desvio, color='k', fmt='o', capsize=5)

eixo.set_title('Relação Zr nos dois revestimentos', fontsize = 15, pad = 7)
eixo.set_xlabel('Revestimento', fontsize = 12)
eixo.set_ylabel('%Zr', fontsize = 12)

 

Usando o método xticks() da biblioteca matplotlib.

Outra forma, que demanda um pouco mais de ajustes é usando o xticks() que é um método que altera os intervalos do eixo x e nos dá a liberdade de definir a posição desejada das nossas barras. No seu caso, ele precisa de 2 parâmetros tickse labels. Os ticks, seriam as posições dos meus valores no eixo desejado (aqui vamos usar 0 e 1) e os labels, as categorias ou variáveis que são descritas em cada posição. Nesse caso, podemos remover o parâmetro width do bar() já que faremos o ajuste por este outro método.

Assim, o seu código poderia seguir, também, essa outra forma:

fig = plt.figure(figsize=(5,4))
eixo = fig.add_axes([0, 0, 1, 1])

cores = ['steelblue', 'indianred']

# Listas dos revestimentos e a posição de cada um no eixo x --> 0 e 2
revestimentos = ['ZR14', 'ZR16']
x_pos = [0, 2]

# Tanto em bar(), quanto em errobar() primeiro passamos a variável x_pos que é 
# responsável pela posição de cada categoria no eixo x, e os labels (revestimentos)
# só serão aplicados no xticks
eixo.bar(x_pos, tabelaZr, color=cores)
eixo.errorbar(x_pos, tabelaZr, yerr=desvio, color='k', fmt='o', capsize=5)

# Definindo a categoria correspondente (revestimentos) para cada posição (x_pos)
plt.xticks(x_pos, revestimentos)

eixo.set_title('Relação Zr nos dois revestimentos', fontsize = 15, pad = 7)
eixo.set_xlabel('Revestimento', fontsize = 12)
eixo.set_ylabel('%Zr', fontsize = 12)

Espero ter ajudado e qualquer dúvida é só chamar!

Forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Oi, Afonso! Obrigada pela resposta!

Ajustei tuas dicas no meu código!

Mas o que eu realmente queria fazer era colocar as barras mais próximas mesmo e não apenas deixá-las mais grossas, entende? É mais pelo fato de que eu acho que fica visualmente mais bonito quando as barras não são tão grossas sem necessidade e se estão um pouco mais próximas e não tão separadas como no gráfico que mandei no início!

Se souber como fazer isso, ainda vou precisar da tua ajuda :D Não sei se de repente ali onde defini eixo

eixo = fig.add_axes([0, 0, 1, 1])

tentei mudar por aqui também mas as barras não se aproximam. Será que usar outra biblioteca ou código seria melhor?

solução!

Então nesse caso vou ser mais hardcore.. hehehe

Vamos manter o width das barras em 0.2, mas agora vamos adotar, por exemplo, a posição do centro das nossas barras para 0.3 e 0.7.

Mas por quê?

Assim, nós podemos forçar através do método set_xlim() os limites de nosso eixo x de 0 para 1. Com esse limite fixado, podemos posicionar nossas barras com o tipo de revestimento da forma que mais nos adequa. Escolhi 0.3 e 0.7 pelo simples fato de manter 0.3 de distância do limite máximo e mínimo do eixo x e um espaçamento de 0.4 entre os centros das barras.

fig = plt.figure(figsize=(5,4))
eixo = fig.add_axes([0, 0, 1, 1])

cores = ['steelblue', 'indianred']

# Listas dos revestimentos e a posição de cada um no eixo x (0.3, 0.7)
revestimentos = ['ZR14', 'ZR16']
x_pos = [0.3, 0.7]

# Tanto em bar, quanto em errobar primeiro passamos a variável x_pos que é 
# responsável pela posição de cada categoria no eixo x, e os labels (revestimentos)
# só serão aplicados no xticks. Aqui mantenho width = 0.2
eixo.bar(x_pos, tabelaZr, color=cores, width = 0.2)
eixo.errorbar(x_pos, tabelaZr, yerr=desvio, color='k', fmt='o', capsize=5)

# Definindo a categoria correspondente (revestimentos) para cada posição (x_pos)
plt.xticks(x_pos, revestimentos)

# Forçando os limites do eixo x para ficar entre 0 e 1 o que ajusta a posição das 
# barras de acordo com o x_pos.
eixo.set_xlim(xmin = 0, xmax = 1)

eixo.set_title('Relação Zr nos dois revestimentos', fontsize = 15, pad = 7)
eixo.set_xlabel('Revestimento', fontsize = 12)
eixo.set_ylabel('%Zr', fontsize = 12)

Se precisar posso explicar com mais detalhes! :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Perfeito, Afonso! Muito obrigada!