# Order Bars in plotly Barchart in R (Example)

This article provides three examples to reorder the categories in a bar plot built with plotly in the R programming language.

The tutorial contains the following sections:

Note: This article was created in collaboration with Kirby White. Kirby is an organizational effectiveness consultant and researcher, who is currently pursuing a Ph.D. at the Seattle Pacific University. You can read more about Kirby here!

## Example Data

Weâ€™ll use the `state.name` and `state.area` datasets for this example, as they are already loaded in R.

If you have not already done so, install and load the plotly package using this code: `install.packages("plotly")` and `library(plotly)`.

Weâ€™ll only use the first five items from each dataset for this tutorial, and we can combine them into a data frame using this code:

```states <- data.frame(State = state.name[1:5],
Area = state.area[1:5])```

Letâ€™s start with a basic barplot to look at the land area in each state. Note that the bars will appear in the row order of the dataset they come from:

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
)```

The bar for each state has been displayed in the order they were listed in the data frame, which happens to be alphabetical.

Letâ€™s explore other ways to order the bars!

## Alphabetically and Reverse Alphabetically

We can customize the bar order with the `layout` settings of a plotly graph. Specifically, the `categoryorder` options.

To order the bars by their name alphabetically, we can use this code:

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
) %>%
layout(xaxis = list(categoryorder = "category ascending"))```

A slight modification to this code lets us display the bars reverse alphabetically:

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
) %>%
layout(xaxis = list(categoryorder = "category descending"))```

## Ascending and Descending Values

To order the bars based on the values they display, we can use this code to sort them in ascending order:

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
) %>%
layout(xaxis = list(categoryorder = "total ascending"))```

A slight modification to this and we can display them in descending order:

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
) %>%
layout(xaxis = list(categoryorder = "total descending"))```

## Custom Order

If you need to sort your bars into an order that isnâ€™t programmatically identifiable by the methods above, you can add one more piece to the `xaxis` layout parameters. Set `categoryorder = "array"` and then use `categoryarray` to specify the order. You can enter a character vector directly or refer to a vector stored in another R object.

```plot_ly(
data = states,
x = ~State,
y = ~Area,
type = "bar"
) %>%
layout(xaxis = list(categoryorder = "array",
categoryarray = c("Arkansas", "California", "Alaska", "Alabama", "Arizona")))```

## Ordered Factors

If youâ€™re working with categories that already have an order specified (i.e., an ordered factor), plotly will automatically display the bars in their ascending order.

Hereâ€™s a sample dataset to demonstrate this:

```x <- c("Very Dissatisfied", "Dissatisfied", "Satisfied", "Very Satisfied")

customers <- data.frame(Satisfaction = factor(x = rev(x),
levels = x,
ordered = TRUE),
Purchases = c(17,16,8,3))```

Hereâ€™s what it looks like using our custom data:

```plot_ly(
data = customers,
x = ~Satisfaction,
y = ~Purchases,
type = "bar"
)```

You can tell that itâ€™s ordered by the factor meta-data because itâ€™s different than how the rows are sorted in the data frame (which is normally the default).

Please note that altering the `categoryorder` settings with the methods described above will revert to an alphabetical ordering and ignore the factor ordering.

## Further Resources

You can check out these other articles for more detailed examples and videos of these popular charts in plotly:

Subscribe to the Statistics Globe Newsletter