Cameron So
Cameron So

Reputation: 149

R graph reorder a factor by levels for only a specified level

I am trying to create a graph where the x axis (a factor) is reordered by descending order of the y axis (numerical values), but only for one of two levels of another factor.

Originally, I tried using the code below:

reorder(factor1, desc(value1))

However, this code only reorganizes the graph (in a descending order) by the sum of the two values under each factor2 (I presume); while I am only interested in reorganizing the data for one level (i.e. "A") under factor2.

Here is some sample data to illustrate better.

sampledata <- data.frame(factor1 = c("A", "A", "B", "B", "C", "C", "D", "D", "E", "E", 
                                     "F", "F", "G", "G", "H", "H", "I", "I", "J", "J"),
                         factor2 = c("A", "H", "A", "H", "A", "H", "A", "H", "A", "H",
                                     "A", "H", "A", "H", "A", "H", "A", "H", "A", "H"), 
                         value1 = c(1, 5, 6, 2, 6, 8, 10, 21, 30, 5, 
                                    3, 5, 4, 50, 4, 7, 15, 48, 20, 21))

Here is what I used previously:

sampledata %>%
   ggplot(aes(x=reorder(factor1, desc(value1)), y=value1, group=factor2, color=factor2)) + 
    geom_point()

The reason why I would like to reorder by a specific level (say factor2=="A") is that I can view any deviance of the values for factor2=="H" away from "A" points.

I would appreciate using tidyverse or dplyr as means to solve this problem.

Upvotes: 3

Views: 92

Answers (1)

M--
M--

Reputation: 28826

library(ggplto2)
library(dplyr)

sampledata %>% 
  mutate(value2 = +(factor2=="A")*value1) %>% 
  ggplot(aes(x=reorder(factor1, desc(value2 + value1/max(value1))), y=value1, 
             group=factor2, color=factor2)) + 
  geom_point() +
  xlab("factor1")

Upvotes: 2

Related Questions