Jeff Stratford
Jeff Stratford

Reputation: 53

Changing axis labels and tick marks in ggplot2 violin plots

I have a violin plot just how I like except I would like to change the tick and axis labels. I tried a few different variations (the last being below). I feel like I'm just a comma or a plus sign. I would like the y axis to be "SR Observed", x axis labels to be "Forest Type", and x-axis tick label to be "Bear Oak" and "Oak-Hickory". Most of the solutions involve packages other than ggplot2 but I'd like to see the solution within ggplot2.

Thanks so much!

Jeff

geom_violin()

# p + scale_x_discrete(breaks=c("bear.oak", "oak.hickory"),
#                     labels=c("Bear Oak", "Oak-Hickory")) 

p + stat_summary(fun.y=median, geom="point", size=2, color="red")```

structure(list(forest.type = c("bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "bear.oak", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", "bear.oak", 
"bear.oak", "bear.oak", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", "oak.hickory", 
"oak.hickory", "oak.hickory"), S.obs = c(13, 9, 9, 5.5, 10, 6, 
8, 9.333333333, 9, 9, 11, 8, 9, 9, 10, 11, 8.333333333, 7.5, 
6, 13, 12.5, 9, 9.5, 9, 7, 7, 8, 9, 8, 6, 9, 6, 3, 2, 2, 2, 4, 
3, 11, 5.8, 5.4, 6.4, 6.6, 5, 11, 10, 9.333333333, 6, 10, 10, 
9, 7, 7, 5, 10, 11, 13, 5, 7, 8, 7, 9, 7, 8, 8, 11, 11.5, 16.5, 
4, 7, 6, 5.5, 5, 7, 7, 13, 16, 7, 11, 8.5, 11, 12, 12, 14, 11, 
11, 6, 8.5, 4, 10, 7, 6, 7, 11, 5, 5, 8, 7, 11.5, 10, 8, 5, 9, 
6, 8, 5.5, 7, 4.5, 7, 7, 6.5, 7.5, 5.5, 5, 7.5, 9.5, 6, 8, 5.5, 
9.25, 3.666666667, 5.5, 7.5, 6.5, 6, 8, 6, 13, 14, 14.5, 10.33333333, 
10, 6, 5, 9, 8)), class = "data.frame", row.names = c(NA, -136L
))

Upvotes: 0

Views: 2304

Answers (1)

JBGruber
JBGruber

Reputation: 12478

Assuming the data above is saved as df, I would recommend to first recode your levels using forcats::fct_recode. You can set the axis labels using labs():

library(tidyverse)
df |> 
  mutate(forest_type = fct_recode(forest.type,
                                  "Bear Oak" = "bear.oak",
                                  "Oak-Hickory" = "oak.hickory")) |> 
  ggplot(aes(x = forest_type, y = S.obs)) +
  geom_violin() +
  labs(x = "Forest Type", y = "SR Observed")

Created on 2022-08-23 by the reprex package (v2.0.1)

Following @yacine-hajji approach, you could also just set manual labels for the levels in the plot instead of changing the data:

ggplot(df, aes(x = forest.type, y = S.obs)) + 
  geom_violin()  + 
  scale_x_discrete(labels = c("bear.oak" = "Bear Oak",
                              "oak.hickory" = "Oak-Hickory"))

Upvotes: 2

Related Questions