---
title: "Legend Positioning"
author: "Gilles Colling"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Legend Positioning}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 6,
  fig.height = 4
)
library(ggguides)
library(ggplot2)

# Theme with transparent backgrounds for pkgdown light/dark mode
theme_set(
  theme_grey() +
    theme(
      plot.background = element_rect(fill = "transparent", color = NA),
      panel.background = element_rect(fill = "transparent", color = NA),
      legend.background = element_rect(fill = "transparent", color = NA),
      legend.key = element_rect(fill = "transparent", color = NA),
      legend.box.background = element_rect(fill = "transparent", color = NA)
    )
)
```

## Overview

ggguides provides position helpers that handle legend placement without
requiring knowledge of ggplot2's theme system. Each function sets the
appropriate combination of `legend.position`, `legend.justification`,
and `legend.box.just` to achieve proper alignment.

## Basic Positioning

### Left and Right

```{r left-right, fig.show='hold', out.width='48%'}
p <- ggplot(mtcars, aes(mpg, wt, color = factor(cyl))) +
  geom_point(size = 3) +
  labs(color = "Cylinders")

p + legend_left() + ggtitle("Left")
p + legend_right() + ggtitle("Right")
```

### Top and Bottom

When placing legends at the top or bottom, the legend is automatically
oriented horizontally:

```{r top-bottom, fig.show='hold', out.width='48%'}
p + legend_top() + ggtitle("Top")
p + legend_bottom() + ggtitle("Bottom")
```

### Alignment with Titles

Use the `align_to` parameter to control how the legend aligns with the plot.
The difference is most visible when there's a y-axis label:

```{r align-to, fig.show='hold', out.width='48%'}
p_labeled <- p + labs(title = "Fuel Economy", y = "Weight (1000 lbs)")

# Default: align to panel (legend aligns with the plot area)
p_labeled + legend_top() + ggtitle("Panel alignment (default)")

# Align to full plot (legend spans title/axis labels too)
p_labeled + legend_top(align_to = "plot") + ggtitle("Plot alignment")
```

## Inside Positioning

`legend_inside()` places the legend within the plot panel. You can use
either coordinate values or named shortcuts.

### Using Shortcuts

Available shortcuts: `"topright"`, `"topleft"`, `"bottomright"`, `"bottomleft"`, `"center"`

```{r inside-shortcuts, fig.show='hold', out.width='48%'}
p + legend_inside(position = "topright") + ggtitle("Top right")
p + legend_inside(position = "bottomleft") + ggtitle("Bottom left")
```

### Using Coordinates

For precise control, specify x/y coordinates (0-1 scale) and justification:

```{r inside-coords}
p + legend_inside(x = 0.95, y = 0.95, justification = c("right", "top"))
```

### Adding Background

Inside legends often need a background for readability:

```{r inside-background}
p + legend_inside(
  position = "topright",
  background = "#FFF3E0",
  border = "#FF9800"
)
```

## Direction Control

### Horizontal and Vertical

Control legend entry direction independently of position:

```{r direction, fig.show='hold', out.width='48%'}
p + legend_horizontal() + ggtitle("Horizontal")
p + legend_vertical() + ggtitle("Vertical")
```

### Combining Direction and Position

```{r direction-position}
p + legend_right() + legend_horizontal()
```

## Removing the Legend

```{r legend-none}
p + legend_none()
```

## Summary

| Function | Position | Auto-Direction |
|----------|----------|----------------|
| `legend_left()` | Left of panel | Vertical |
| `legend_right()` | Right of panel | Vertical |
| `legend_top()` | Above panel | Horizontal |
| `legend_bottom()` | Below panel | Horizontal |
| `legend_inside()` | Inside panel | Unchanged |
| `legend_none()` | Hidden | N/A |

**Learn more:**

- [Styling & Customization](styling.html) for font, background, and border options

- [Patchwork Integration](patchwork.html) for multi-panel workflows
