0

I have a plot that looks like this: enter image description here

I used these data and code to produce it:

structure(list(zone = c("Zone 1", "Zone 2", "Zone 3", "Zone 4", 
"Zone 5", "Total", "Zone 1", "Zone 2", "Zone 3", "Zone 4", "Zone 5", 
"Total"), effort = c(3226, 4705, 2443, 131, 276, 10781, 1757, 
7293, 1631, 34.4, 442, 11157), creelyear = c("2013-2014", "2013-2014", 
"2013-2014", "2013-2014", "2013-2014", "2013-2014", "2022-2023", 
"2022-2023", "2022-2023", "2022-2023", "2022-2023", "2022-2023"
)), class = "data.frame", row.names = c(NA, -12L))
df %>% 
  ggplot(aes(x= zone, y= effort, fill=creelyear)) +
  geom_bar(position="dodge",  stat="identity", color = "black")  +                                                      #Select data for plotting
  scale_y_continuous(labels = comma, name = "Pressure (h/km)",
                     limits = c(0,12000), expand = c(0, 0))  +       #Change y axis name and expand so bars touch y axis
  scale_fill_manual(name = "", labels = c("2013-2014", "2022-2023"), values = c("#000000","#d11141"))+
  scale_x_discrete(limit = c("Zone 1", "Zone 2", "Zone 3", "Zone 4", "Zone 5", "Total")) +
  xlab("Zone") +                                                                  #Change name of x axis
  theme(legend.position = 'top',                                                    #Select legend position
        legend.spacing.x = unit(1.0, 'cm'),                                         #Select legend spacing value and units
        legend.background = element_blank(),
        legend.box.background = element_rect(colour = "black"),
        legend.text = element_text(margin = margin(r = 6.2, unit = "cm"), hjust = 2),
        panel.background = element_rect(fill='transparent'),                        #Set panel background to transparent for presentations
        plot.background = element_rect(fill='transparent', color = "transparent"),  #Set plot background to transparent for presentations
        panel.grid.major = element_blank(),                                         #Remove major gridlines
        panel.grid.minor = element_blank(),
        panel.border = element_rect(colour = "black", fill=NA, size=1))

How can I center the text in legend and give some more space between the colors and text so it looks more aesthetically pleasing?

4
  • 4
    Try deleting hjust = 2 in your legend.text customization and see if you like the look of that. If you want to try centering the text, set hjust = 0.5. Commented May 6 at 18:59
  • I should've clarified I still want the box to extend the length of the graph, if I remove hjust it does not do that
    – Ryan Gary
    Commented May 6 at 19:54
  • Pad the box margins or something, maybe pad your text with spaces. But hjust (which stands for "horizontal justification") is the way to set the justification of the text. Commented May 6 at 19:59
  • How do I pad the box or text?
    – Ryan Gary
    Commented May 6 at 20:00

1 Answer 1

2

Here are some potentially helpful options for you. legend.key.spacing.x and legend.margin is what I would use to try to achieve what you want with the top spanning legend. Just keep in mind you are specifying an exact measurement of spacing and that will depend on your total image dimensions and plot size, etc. First & Second show key spacing. Third shows the combination of key spacing and margin (the 4 margin numbers are upper, right, lower and left padding). Fourth is what I would personally do if I were you.

library(ggplot2)
df <- structure(list(zone = c("Zone 1", "Zone 2", "Zone 3", "Zone 4", 
    "Zone 5", "Total", "Zone 1", "Zone 2", "Zone 3", "Zone 4", "Zone 5", 
    "Total"), effort = c(3226, 4705, 2443, 131, 276, 10781, 1757, 
        7293, 1631, 34.4, 442, 11157), creelyear = c("2013-2014", "2013-2014", 
            "2013-2014", "2013-2014", "2013-2014", "2013-2014", "2022-2023", 
            "2022-2023", "2022-2023", "2022-2023", "2022-2023", "2022-2023"
        )), class = "data.frame", row.names = c(NA, -12L))

base <- df |> 
    ggplot(aes(x= zone, y= effort, fill=creelyear)) +
    geom_bar(position="dodge",  stat="identity", color = "black") +
    scale_y_continuous(labels = scales::comma, name = "Pressure (h/km)",
        limits = c(0,12000), expand = c(0, 0)) +
    scale_fill_manual(labels = c("2013-2014", "2022-2023"), values = c("#000000","#d11141")) + # No need to specify name = "" if you set legend title to element_blank()
    scale_x_discrete(limit = c("Zone 1", "Zone 2", "Zone 3", "Zone 4", "Zone 5", "Total")) +
    xlab("Zone") +
    theme(panel.background = element_rect(fill='transparent'),
        plot.background = element_rect(fill='transparent', color = "transparent"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_rect(colour = "black", fill=NA, linewidth=1))
base +
    theme(legend.position = 'top',
        legend.key.spacing.x = unit(1.5, 'cm'),
        legend.background = element_rect(colour = "black"),
        legend.title = element_blank())

base +
    theme(legend.position = 'top',
        legend.key.spacing.x = unit(10, 'cm'),
        legend.background = element_rect(colour = "black"),
        legend.title = element_blank())

base +
    theme(legend.position = 'top',
        legend.key.spacing.x = unit(7.5, 'cm'),
        legend.margin = margin(5,50,5,50),
        legend.background = element_rect(colour = "black"),
        legend.title = element_blank())

base +
    theme(legend.position = 'inside',
        legend.byrow = TRUE,
        legend.justification.inside = c(0.025, 0.975),
        legend.background = element_rect(colour = "black"),
        legend.title = element_blank())

Created on 2024-05-06 with reprex v2.1.0

Not the answer you're looking for? Browse other questions tagged or ask your own question.