How to correctly position the Abels in the barplot?

Asked

Viewed 5,010 times

10

I am not able to correctly position the names in a barplot of R, because they are very extensive. My data is this way:

inserir a descrição da imagem aqui

The names end up appearing this way:

inserir a descrição da imagem aqui

fator_tecnologico_labels <- c(
  "Facilidade de testar\n e de ser avaliado\n por usuários\n de um modo geral",
  "Utilização de\n desenvolvimento\n e de qualidade\n bem definidos\n por parte\n do fabricante",
  "Compatibilidade\n com a\n infraestrutura\n existente,\n com os\n requisitos/\nnecessidades/\ndemandas,\n e/ou com a\n tecnologia\n em vigor",
  "Facilidade de\n entender,\n utilizar\n e/ou adaptar",
  "Vantagem(ns)\n em relação a\n custos com\n hardware,\n requisitos mínimos\n menos exigentes,\n custos com\n licença ou suporte,\n etc",
  "Maior\n eficiência\n em relação\n à solução,\n livre ou não,\n utilizada\n atualmente",
  "Maior\n confiabilidade\n em relação\n à solução,\n livre ou não,\n utilizada\n atualmente"  
)

How can I make the names that are overwriting the bars appear correctly?

  • 1

    What is "correctly" in this case? The third group has a long text, and if you simply lower the x-axis, the result may not be visually pleasurable. In any case, you may be able to adjust the edges of the X-axis labels with the pair command: http://www.programmingr.com/content/controlling-margins-and-axes-oma-and-mgp/

  • @Soriano, you can post the code in which you call the function barplot?

2 answers

10

First I reversed the chart orientation, putting the bars horizontally:

fator_tecnologico_graph <- barplot(
  fator_tecnologico,
  beside = TRUE, 
  horiz=TRUE, 
  las=1,  
  xlim=c(0,110),
  cex.axis = 0.7,  
  cex.names = 0.6,  
  legend.text = rownames(fator_tecnologico),
  args.legend = list("bottom", bty="n", cex = 0.7),
  col=rainbow(4),
  xpd=FALSE,
  cex.main = 0.9,
  main="Na sua opinião, em que grau estes fatores influenciam\n a adoção de software livre do ponto de vista tecnológico?"
)

Then I increased the left margin of the chart

par(mar=c(5, 18, 4, 2))

And then I got something satisfying for myself

inserir a descrição da imagem aqui

  • Good solution. :)

  • 1

    @Soriano: how about accepting the solution? :)

5


A solution with the ggplot2:

dados <- read.table(text='8 5 4 6 4 4 2
41 58 15 19 19 33 30
60 59 67 54 49 59 56
43 30 66 73 80 56 64', header=F, sep=' ')

fator_tecnologico_labels <- c(
  "Facilidade de testar e de ser avaliado\n por usuários de um modo geral",
  "Utilização de desenvolvimento e de qualidade\n bem definidos por parte do fabricante",
  "Compatibilidade com a infraestrutura existente,\n com os requisitos/necessidades/demandas, e/ou com a tecnologia\n em vigor",
  "Facilidade de entender, utilizar\n e/ou adaptar",
  "Vantagem(ns) em relação a custos com hardware,\n requisitos mínimos menos exigentes, custos com licença ou suporte, etc",
  "Maior eficiência em relação à solução,\n livre ou não, utilizada atualmente",
  "Maior confiabilidade em relação\n à solução, livre ou não, utilizada\n atualmente"  
)

# Até aqui tu tem.

dados <- cbind(dados, Label=c('Nenhuma influência', 'Pouca influência', 'Influência considerável', 'Muita influência')) 

dados <- reshape(dados, varying = list(c('V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7')), direction='long', idvar='Label', times=fator_tecnologico_labels) # Para usar o ggplot2 os dados precisam estar nesse formato.

require(ggplot2)

grafico <- ggplot(aes(x=time, y=V1, fill=Label), data=dados) + # Informa os dados
geom_bar(stat='identity', position='dodge') + # Informa que tu quer um gráfico de barras
coord_flip() + # Inverte os eixos X e Y
xlab('Frequencia') + # Coloca titulo no eixo X
ylab('Fatores') +  # Coloca titulo do eixo Y
ggtitle("Na sua opinião, em que grau estes fatores influenciam\n a adoção de software livre do ponto de vista tecnológico?") + # Coloca titulo no grafico
scale_fill_hue('Legenda') # Coloca titulo na legenda

grafico

Resultado do ggplot2

EDIT:

Using the strwrap() to break the text.

dados <- read.table(text='8 5 4 6 4 4 2
41 58 15 19 19 33 30
60 59 67 54 49 59 56
43 30 66 73 80 56 64', header=F, sep=' ')

fator_tecnologico_labels <- c(
  "Facilidade de testar e de ser avaliado por usuários de um modo geral",
  "Utilização de desenvolvimento e de qualidade bem definidos por parte do fabricante",
  "Compatibilidade com a infraestrutura existente, com os requisitos/necessidades/demandas, e/ou com a tecnologia em vigor",
  "Facilidade de entender, utilizar e/ou adaptar",
  "Vantagem(ns) em relação a custos com hardware, requisitos mínimos menos exigentes, custos com licença ou suporte, etc",
  "Maior eficiência em relação à solução, livre ou não, utilizada atualmente",
  "Maior confiabilidade em relação à solução, livre ou não, utilizada atualmente"  
)

# Quebrando o texto automaticamente (Só tirei os \n do vetor de cima e acrescentei as 3 linhas abaixo)
tamanho <- 40 # O limite de caracteres (ele vai quebrar no espaço anterior a palavra que ultrapassa o limite)
(fator_tecnologico_labels <- strwrap(fator_tecnologico_labels, tamanho, simplify=F)) # Cria uma lista onde cada elemento é um vetor com até 40 caracteres. 
(fator_tecnologico_labels <- mapply(paste, fator_tecnologico_labels, collapse='\n')) # Monta o vetor com as labels.


# Até aqui tu tem.

dados <- cbind(dados, Label=c('Nenhuma influência', 'Pouca influência', 'Influência considerável', 'Muita influência')) 
dados <- reshape(dados, varying = list(c('V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7')), direction='long', idvar='Label', times=fator_tecnologico_labels) # Para usar o ggplot2 os dados precisam estar nesse formato.



require(ggplot2)

grafico <- ggplot(aes(x=time, y=V1, fill=Label), data=dados) + # Informa os dados
geom_bar(stat='identity', position='dodge') + # Informa que tu quer um gráfico de barras
coord_flip() + # Inverte os eixos X e Y
xlab('Frequencia') + # Coloca titulo no eixo X
ylab('Fatores') +  # Coloca titulo do eixo Y
ggtitle("Na sua opinião, em que grau estes fatores influenciam a adoção de software livre do ponto de vista tecnológico?") + # Coloca titulo no grafico
scale_fill_hue('Legenda') # Coloca titulo na legenda
grafico
  • 2

    Something that can help you break the text into equal/similar sizes: strwrap(string, tamanho).

  • If I use this inside the Labels array it would create more lines... What would be the right way? Sorry, I’m half Noob even in R

  • 1

    I added a new example.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.