## Order Bars in ggplot2 bar graph

The key with ordering is to set the levels of the factor in the order you want. An ordered factor is not required; the extra information in an ordered factor isn't necessary and if these data are being used in any statistical model, the wrong parametrisation might result — polynomial contrasts aren't right for nominal data such as this.

`## set the levels in order we want`

theTable <- within(theTable,

Position <- factor(Position,

levels=names(sort(table(Position),

decreasing=TRUE))))

## plot

ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)

In the most general sense, we simply need to set the factor levels to be in the desired order. If left unspecified, the levels of a factor will be sorted alphabetically. You can also specify the level order within the call to factor as above, and other ways are possible as well.

`theTable$Position <- factor(theTable$Position, levels = c(...))`

## Reorder bars in geom_bar ggplot2 by value

Your code works fine, except that the barplot is ordered from low to high. When you want to order the bars from high to low, you will have to add a `-`

sign before `value`

:

`ggplot(corr.m, aes(x = reorder(miRNA, -value), y = value, fill = variable)) + `

geom_bar(stat = "identity")

which gives:

**Used data:**

`corr.m <- structure(list(miRNA = structure(c(5L, 2L, 3L, 6L, 1L, 4L), .Label = c("mmu-miR-139-5p", "mmu-miR-1983", "mmu-miR-301a-3p", "mmu-miR-5097", "mmu-miR-532-3p", "mmu-miR-96-5p"), class = "factor"),`

variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "pos", class = "factor"),

value = c(7L, 75L, 70L, 5L, 10L, 47L)),

class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))

## Reordering bars in ggplot2 bar graph using only one variable (w/o value or ranking)?

`library(ggplot2)`

df

# resp comp

# 1 1 Party A

# 2 2 Party A

# 3 3 Party B

# 4 4 Party B

# 5 5 Party B

# 6 6 Party C

df1 <- data.frame(table(df$comp))

df1

# Var1 Freq

# 1 Party A 2

# 2 Party B 3

# 3 Party C 1

**Manually arranging levels using factor()**

`df1$Var1 <- factor(df1$Var1, c("Party B", "Party C", "Party A"))`

df1

# Var1 Freq

# 2 Party B 3

# 3 Party C 1

# 1 Party A 2

ggplot(df1, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity")

**Frequency of party in decreasing order**

`df1 <- data.frame(table(df$comp))`

df1

# Var1 Freq

# 1 Party A 2

# 2 Party B 3

# 3 Party C 1

df1 <- df1[order(df1$Freq, decreasing=TRUE),]

df1

# Var1 Freq

# 2 Party B 3

# 1 Party A 2

# 3 Party C 1

ggplot(df1, aes(x = Var1, y = Freq)) + geom_bar(stat = "identity")

## ggplot2: reorder bars in barplot from highest to lowest

The problem is due to a wrong use of `reorder`

.

`library(ggplot2)`

library(egg)

mydf <- transform(mydf, variables = reorder(variables, -VIP))

p1 <-

ggplot(mydf, aes(x = variables, y = VIP))+

geom_bar(stat="identity") +

geom_hline(yintercept = 1, size = 2, linetype = 3) +

theme(axis.title.x =element_blank())

p2 <-

ggplot(mydf, aes(x = variables, y = coefficient, group = 1))+

geom_point()+

geom_line()+

geom_hline(yintercept = 0, size = 2, linetype = 3)

grid.draw(egg::ggarrange(p1,p2 , ncol=1))

## Order bar chart by another variable in ggplot

We could convert the 'Taxa' to `factor`

based on the `order`

of 'LDA.score' and then use that in `ggplot`

`library(dplyr)`

library(ggplot2)

Example %>%

mutate(Taxa = factor(Taxa, levels = as.character(Taxa)[order(LDA.score)])) %>%

ggplot(., aes(x=Taxa, y=LDA.score, fill=Status)) +

geom_bar(stat="identity", position="identity") +

coord_flip()

-output

## reorder bars of ggplot with increasing y value

Here your issue to reorder bargraph is that you are calculating the mean and the standard deviation in `ggplot2`

. So, if you pass the "classic" `reorder(x, -y)`

, it will set the order based on the individual values of y not the mean.

So, you need to calculate Mean and SD before passing nbi as an argument in `ggplot2`

:

`library(dplyr)`

library(ggplot2)

DF %>% group_by(sig_lip) %>%

summarise(Mean = mean(nbi, na.rm = TRUE),

SD = sd(nbi, na.rm = TRUE)) %>%

ggplot(aes(x = reorder(sig_lip,-Mean), y = Mean, fill = sig_lip))+

geom_col()+

geom_errorbar(aes(ymin = Mean-SD, ymax = Mean+SD))

Does it answer your question ?

If not, please provide a reproducible example of your dataset by follwoign this guide: How to make a great R reproducible example

## How can I reorder bars in ggplot according to variable using lapply

I edit to add label for the column name.

I took the liberty to make some changes into your code:

- use aes() instead of aes_string()
- converted from tibble to dataframe.
- change function

The approach I can provide is as follows:

`#Convert to dataframe`

stars<-as.data.frame(starwars)

Now, in this case, you want the numeric variables and the names. So, I selected only the relevant columns.

`#Select relevant columns`

stars<-cbind(stars["name"],Filter(is.numeric,stars))

#Remove missing values

stars<- na.omit(stars)

Lets define the function to plot:

`#Define my function to plot`

plot_function <- function(data_vars,colid) {

ggplot(stars, aes(x=reorder(name,data_vars),y=data_vars)) +

geom_bar(stat = "identity")+

labs(y=colid)+

coord_flip()

}

Now, this is the important part. To run the function across to variables of interest, we do not provide a character vector with the column names. Instead, we "feed" the lapply(), with the dataframe columns of the variables of interest. Since we want column names we can loop the lapply by each column:

` #Run function across variables of interest`

stars_num<-Filter(is.numeric,stars)

for (i in 1:3){

p[[i]]<-lapply(stars_num[i], plot_function,

names(stars_num[i]))

}

And you should get the output you want. But for sure there is a better alternative.

## ggplot2: How to reorder stacked bar charts by proportions of fill variable

Hopefully this makes up for lack of concision with clarity:

`df %>% `

left_join( # Add res_share for each neighborhood

df %>%

group_by(neighborhood) %>%

mutate(share = count / sum(count)) %>%

ungroup() %>%

filter(type == "residential_unit") %>%

select(neighborhood, res_share = share)

) %>%

mutate(neighborhood = fct_reorder(neighborhood, res_share)) %>%

ggplot(aes(neighborhood, count, fill = type)) +

geom_col(position = "fill") +

scale_y_continuous(labels = scales::percent) +

coord_flip() +

theme_light()

## Ordering bar chart by value in R using ggplot2

You can use `reorder`

to order you bars. You can use the following code:

`df <- data.frame(ID = c(70, 48, 139, 293, 12),`

Word = c("a", "b", "c", "d", "e"),

Frequency = c(194, 116, 104, 87, 87))

plot = ggplot(data=df, aes(x=reorder(Word, -Frequency) , y=Frequency, label=Frequency)) +

geom_bar(stat="identity") +

geom_text(size = 5, position = position_stack(vjust = 1.04)) +

coord_flip() +

labs(x = "Word")

plot

Output:

Use `reorder(Word, Frequency)`

:

`plot = ggplot(data=df, aes(x=reorder(Word, Frequency) , y=Frequency, label=Frequency)) +`

geom_bar(stat="identity") +

geom_text(size = 5, position = position_stack(vjust = 1.04)) +

coord_flip() +

labs(x = "Word")

plot

Output:

## Reorder bars in geom_bar by multiple factors

yes, here's one solution:

`data(wilson, package = "MM")`

non_met <- as.data.frame(non_met)

non_met$ID <- seq(1,nrow(non_met))

non_met <- non_met[order(-non_met$VS, -non_met$S, -non_met$US),]

non_met$order <- seq(1,nrow(non_met))

mhouse <- melt(non_met, id=c("ID", "order"))

ggplot(mhouse, aes(x=reorder(ID, order), y=value, fill = variable)) +

geom_bar(stat = "identity", lwd=0.5, color="white")

but I'm open to any other idea about that problem

### Related Topics

Remove Ids With Fewer Than 9 Unique Observations

Remove Space Between Plotted Data and the Axes

Multi-Row X-Axis Labels in Ggplot Line Chart

How to Force a Line Break in Rmarkdown'S Title

Remove Last N Rows in Data Frame With the Arbitrary Number of Rows

R: How to Get the Percentage Change from Two Different Columns

Concatenating Two Text Columns in Dplyr

Adding Value from One Data.Frame to Another Data.Frame by Matching a Variable

How to Convert Only Some Positive Numbers to Negative Numbers (Conditional Recoding)

Dplyr Conditional Summarise Function

How to Add a Suffix (Or Prefix) Elements of an Existing List

Converting Data Frame into a List of Lists in R

Conditionally Replace Values of Subset of Rows With Column Name in R Using Only Tidy

Remove Quotes from a Character Vector in R

How to Subset Matrix to One Column, Maintain Matrix Data Type, Maintain Row/Column Names