Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://flrd.github.io/ggpointless/

A Collection of Geometries, and Stats for 'ggplot2'
https://flrd.github.io/ggpointless/

data-visualization ggplot2 r rstats

Last synced: 2 days ago
JSON representation

A Collection of Geometries, and Stats for 'ggplot2'

Awesome Lists containing this project

README

        

---
output: github_document
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-",
out.width = "100%",
fig.align = "center",
fig.height = 3,
dev = "ragg_png",
dpi = 132
)

library(ggpointless)
```

# ggpointless

[![CRAN status](https://www.r-pkg.org/badges/version/ggpointless)](https://CRAN.R-project.org/package=ggpointless)
[![R-CMD-check](https://github.com/flrd/ggpointless/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/flrd/ggpointless/actions/workflows/R-CMD-check.yaml)
[![Codecov test coverage](https://codecov.io/gh/flrd/ggpointless/branch/main/graph/badge.svg)](https://app.codecov.io/gh/flrd/ggpointless?branch=main)
![downloads](https://cranlogs.r-pkg.org/badges/grand-total/ggpointless))

`ggpointless` is an extension of the [`ggplot2`](https://ggplot2.tidyverse.org/) library providing additional layers.

## Installation

You can install `ggpointless` from CRAN with:

```{r eval=FALSE}
install.packages("ggpointless")
```

To install the development version from [GitHub](https://github.com/) use:

``` {r eval=FALSE}
# install.packages("devtools")
devtools::install_github("flrd/ggpointless")
```

Once you have installed the package, attach it by calling:

```{r}
library(ggpointless)
```

## What will you get

- `geom_pointless()` -- emphasizes some observations with points
- `geom_lexis()` -- draws a Lexis diagram
- `geom_chaikin()` -- applies Chaikin's corner cutting algorithm
- `geom_catenary()` -- draws a catenary curve

See [`vignette("ggpointless")`](https://flrd.github.io/ggpointless/articles/ggpointless.html)
for details and examples.

### geom_pointless
`geom_pointless()` let's you highlight the first, or last observations, sample minimum and sample maximum to provide additional context. Or just some visual sugar. `geom_pointless()` behaves similar to `geom_point()` except that it has a `location` argument. You can set it to `"first"`, `"last"` (default), `"minimum"`, `"maximum"`, and `"all"`, where `"all"` is just shorthand to select `"first"`, `"last"`, `"minimum"` and `"maximum"`.

```{r hello-world}
cols <- c("#f4ae1b", "#d77e7b", "#a84dbd", "#311dfc")
theme_set(theme_minimal())

x <- seq(-pi, pi, length.out = 500)
y <- outer(x, 1:5, function(x, y) sin(x * y))

df1 <- data.frame(
var1 = x,
var2 = rowSums(y)
)

ggplot(df1, aes(x = var1, y = var2)) +
geom_line() +
geom_pointless(aes(color = after_stat(location)),
location = "all",
size = 3
) +
scale_color_manual(values = cols)
```

### geom_lexis
`geom_lexis()` is a combination of a segment and a point layer. Given a start value and an end value, this function draws a 45° line which indicates the duration of an event. Required are `x` and `xend` aesthetics, `y` and `yend` coordinates will be calculated.

```{r geom-lexis, warning=FALSE}
df2 <- data.frame(
key = c("A", "B", "B", "C", "D"),
x = c(0, 1, 6, 5, 6),
xend = c(5, 4, 10, 8, 10)
)

ggplot(df2, aes(x = x, xend = xend, color = key)) +
geom_lexis(aes(linetype = after_stat(type)), size = 2) +
coord_equal() +
scale_x_continuous(breaks = c(df2$x, df2$xend)) +
scale_color_manual(values = cols) +
scale_linetype_identity() +
theme(panel.grid.minor = element_blank())
```

See also the [`LexisPlotR` package](https://github.com/ottlngr/LexisPlotR).

### geom_chaikin

Chaikin's corner cutting algorithm let's you turn a ragged path or polygon into a smoothed one. Credit to [Farbfetzen / corner_cutting](https://github.com/Farbfetzen/corner_cutting).

```{r geom-chaikin, warning=FALSE}
lst <- list(
data = list(
closed_square = data.frame(x = c(0, 0, 1, 1), y = c(2, 3, 3, 2)),
whale = data.frame(x = c(.5, 4, 4, 3.5, 2), y = c(.5, 1, 1.5, .5, 3)),
open_triangle = data.frame(x = c(3, 3, 5), y = c(2, 3, 3)),
closed_triangle = data.frame(x = c(3.5, 5, 5), y = c(0, 0, 1.5))
),
color = cols,
closed = c(TRUE, TRUE, FALSE, TRUE)
)

ggplot(mapping = aes(x, y)) +
lapply(lst$data, function(i) {
geom_polygon(data = i, fill = NA, linetype = "12", color = "#777777")
}) +
Map(f = function(data, color, closed) {
geom_chaikin(data = data, color = color, closed = closed)
}, data = lst$data, color = lst$color, closed = lst$closed) +
geom_point(data = data.frame(x = 1.5, y = 1.5)) +
coord_equal()
```

See also the [`smoothr` package](https://github.com/mstrimas/smoothr/).

### geom_catenary

Draws a flexible curve that simulates a chain or rope hanging loosely between
two fixed points. By default, a chain length twice the Euclidean distance
between each x/y combination is used. See [`vignette("ggpointless")`](https://flrd.github.io/ggpointless/articles/ggpointless.html)
for details.

Credit to: [dulnan/catenary-curve](https://github.com/dulnan/catenary-curve)

```{r geom-catenary, warning=FALSE}
ggplot(data.frame(x = 1:5, y = sample(5)),
aes(x, y)) +
geom_catenary() +
geom_point(size = 3, colour = "#f4ae1b")
```

## Data

In addition to the geoms & stats, the following data sets are contained in `ggpointless`:

1. `co2_ml` : [CO~2~ records taken at Mauna Loa](https://gml.noaa.gov/ccgg/trends/data.html)
2. `covid_vac` : [COVID-19 Cases and Deaths by Vaccination Status](https://covid.cdc.gov/covid-data-tracker/#rates-by-vaccine-status)
3. `female_leaders` : [Elected and appointed female heads of state and government](https://en.wikipedia.org/w/index.php?title=List_of_elected_and_appointed_female_heads_of_state_and_government&oldid=1078024588)

For more examples call [`vignette("examples")`](https://flrd.github.io/ggpointless/articles/examples.html).

## Code of Conduct

Please note that this project is released with a [Contributor Code of Conduct](https://github.com/flrd/ggpointless/blob/main/CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.