Home > Software engineering >  What is wrong with my code for a bar chart in ggplot?
What is wrong with my code for a bar chart in ggplot?

Time:09-20

I am having problems with one of my bar charts. I cannot find the error. I want to sort some categories (naering) in descending order depending on a value (egenutfort_fou). When I use dplyr functions, it does work properly:

df %>%
  arrange(desc(egenutfort_fou)) %>%
  head(5)

# A tibble: 5 × 4
  naering                                egenutfort_fou innkopt_fou produktinnovasjon
  <chr>                                           <dbl>       <dbl>             <dbl>
1 J62 IT-tjenester                                8090.        404.               984
2 M71 Arkitekter og tekniske konsulenter          2965.        681.               730
3 C26 Data- og elektronisk industri               2237.        118.                83
4 K64-K66 Finansiering og forsikring              2203.          6                217
5 B05-B09 Bergverksdrift og utvinning             1868.       2054                 65

However, when I use ggplot in order to plot into a graph, it does not sort the values in descending order anymore.

df %>%
  arrange(desc(egenutfort_fou)) %>%
  head(5) %>%
  ggplot(aes(x = egenutfort_fou, y = naering))  
  geom_bar(stat = "identity")

enter image description here

I couldn't figure out what the mistake is. I always create bar charts in that way and it never occured an issue with that.

Here is a reproducible example:

structure(list(naering = c("A03 Fiske, fangst og akvakultur", 
"B05-B09 Bergverksdrift og utvinning", "C10-C11 Næringsmiddel- og drikkevareindustri", 
"C13 Tekstilindustri", "C14-C15 Beklednings-, lær- og lærvareindustri", 
"C16 Trelast- og trevareindustri", "C17 Papir- og papirvareindustri", 
"C18 Trykking, grafisk industri", "C19-C20 Petroleums-, kullvare- og kjemisk industri", 
"C21 Farmasøytisk industri", "C22 Gummivare- og plastindustri", 
"C23 Mineralproduktindustri", "C24 Metallindustri", "C25 Metallvareindustri", 
"C26 Data- og elektronisk industri", "C27 Elektroteknisk industri", 
"C28 Maskinindustri", "C29 Motorkjøretøyindustri", "C30 Transportmiddelindustri ellers", 
"C31 Møbelindustri", "C32 Annen industri", "C33 Reparasjon og installasjon av maskiner og utstyr", 
"D35 Kraftforsyning", "E36-E39 Vann, avløp og renovasjon", "F41-F43 Bygge- og anleggsvirksomhet", 
"G46 Agentur- og engroshandel", "H49-H53 Transport og lagring", 
"J59-J60 Film- og TV-prod., musikkutgivelse, radio- og fjernsynskringkasting", 
"J61 Telekommunikasjon", "J62 IT-tjenester", "J63 Informasjonstjenester", 
"K64-K66 Finansiering og forsikring", "M70 Hovedkontortjen. og adm. rådgivning", 
"M71 Arkitekter og tekniske konsulenter", "M72 Forskning og utviklingsarbeid", 
"M74.9 Annen faglig, vitenskapelig og teknisk virksomhet", "N82.9 Annen forretningsmessig tj.yting"
), egenutfort_fou = c(951.1, 1867.5, 1180, 36.5, 40.9, 205, 145.9, 
66.5, 1718.1, 442.7, 189.9, 152.3, 484.8, 1433.3, 2236.7, 584.6, 
1441.2, 194.5, 402.4, 179.8, 305.1, 316.3, 447.9, 158.2, 352.9, 
838.7, 320.5, 74.8, 714.5, 8090.5, 403.1, 2202.9, 555.8, 2965.2, 
1460, 374.7, 93.7), innkopt_fou = c(201.8, 2054, 178.9, 5.9, 
0, 35.6, 8.8, 2.5, 370.3, 789.7, 23, 40.4, 91.1, 88, 118.3, 22.2, 
61.8, 73.5, 115.5, 14.5, 103.3, 100.9, 23.6, 153.6, NA, 187.9, 
13.4, 248.2, 116.1, 404.4, 220.2, 6, 77, 680.8, 60.1, 525.2, 
53.7), produktinnovasjon = c(94, 65, 441, 42, 22, 100, 13, 61, 
53, 10, 70, 80, 17, 216, 83, 81, 178, 37, 46, 48, 82, 138, 105, 
78, 303, 1308, 142, 112, 70, 984, 124, 217, 281, 730, 119, 235, 
119)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-37L))

Thanks!

CodePudding user response:

The order of your table doesn't matter for the plot. The categories are still ordered alphabetically. Instead you could use reorder which will convert to a factor with the order of the levels set according to a numeric variable:

library(dplyr)
library(ggplot2)

df %>%
  arrange(desc(egenutfort_fou)) %>%
  head(5) %>%
  ggplot(aes(x = egenutfort_fou, y = reorder(naering, egenutfort_fou)))  
  geom_bar(stat = "identity")

enter image description here

CodePudding user response:

By default, ggplot will plot the y axis values in alphabetical order, whatever the order of your initial data frame. To change this, you can switch naering to a factor:

df %>%
  arrange(desc(egenutfort_fou)) %>%
  head(5) %>%
  mutate(naering = factor(naering, rev(naering))) %>%
  ggplot(aes(x = egenutfort_fou, y = naering))  
  geom_bar(stat = "identity")

enter image description here

  • Related