---
title: "obsplot Gallery : Plot changelog"
author: "Julien Barnier"
date: "`r Sys.Date()`"
output:
rmarkdown::html_vignette:
fig_width: 7
fig_height: 4.5
toc: true
vignette: >
%\VignetteIndexEntry{obsplot Gallery : Plot changelog}
%\VignetteEncoding{UTF-8}
%\VignetteEngine{knitr::rmarkdown}
editor_options:
chunk_output_type: console
---
```{r, include=FALSE}
library(htmlwidgets)
knitr::opts_chunk$set(
screenshot.force = FALSE,
echo = TRUE
)
options("obsplot_menu" = FALSE)
library(obsplot)
library(dplyr)
```
This document tries to reproduce charts included in the [Observable Plot Changelog](https://github.com/observablehq/plot/blob/main/CHANGELOG.md).
Currently supported Plot version : 0.2.8.
## Plot 0.2.3
`rect`, `bar`, and `rule` marks now accept an interval option.
```{r}
obsplot(aapl) |>
mark_barX(
x = "Date",
interval = JS("d3.utcYear"),
fill = "Date"
)
```
## Plot 0.2.1
All marks now support `dx` and `dy` constant options.
```{r}
data(athletes)
obsplot(athletes) |>
mark_dot(x = "weight", y = "height", dx = -100, dy = 250)
```
```{r}
obsplot(athletes) |>
mark_rect(
transform_bin(
list(
fill = "count",
title = JS("(bin, {x1, x2, y1, y2}) => `${bin.length} athletes weighing between ${x1} and ${x2} and with a height between ${y1} and ${y2}`")
),
x = "weight", y = "height", inset = 0
)
)
```
## Plot 0.2.0
### Render functions
Marks can be passed as render functions. This can be achieved in `obsplot` with `mark_function()` or `mark_svg()` :
```{r}
data(aapl)
obsplot(aapl) |>
mark_line(x = "Date", y = "Close") |>
mark_svg("Hello, world!")
```
When using `mark_function`, the function definition must be enclosed into an `htmlwidgets::JS` call. The `svg` template literal has been imported from Observable standard library and can be used directly :
```{r}
obsplot(aapl) |>
mark_line(x = "Date", y = "Close") |>
mark_function(JS("() => svg`Hello, world!`"))
```
### Marks
All marks now accept a `shapeRendering` option :
```{r}
obsplot() |>
mark_dot(x = 0, y = 0, r = 100, shapeRendering = "crispEdges")
```
`strokeWidth` option can be specified as a channel :
```{r}
df <- data.frame(value = 1:40, stroke = (1:40) / 15)
obsplot(df, height = 60) |>
mark_dotX(x = "value", strokeWidth = "stroke")
```
`stroke` and `strokeOpacity` for `text` mark can now be specified as channels :
```{r}
df <- data.frame(value = LETTERS[1:10], x = 1:10, opacity = seq(0, 1, length.out = 10))
obsplot(df, height = 60) |>
mark_textX(x = "x", text = "value", stroke = "x", strokeOpacity = "opacity")
```
Collapsed domains handling in marks that represent continuous intervals :
```{r}
obsplot(df) |>
mark_rectY(data = c(1, 1, 1), transform_binX())
```
### Scales
New `sort` options :
```{r}
data(alphabet)
obsplot(alphabet) |>
mark_barY(
x = "letter", y = "frequency",
sort = list(x = "y", reverse = TRUE)
)
```
New *threshold* scale type :
```{r}
obsplot(alphabet) |>
mark_barY(
x = "letter", y = "frequency", fill = "frequency",
sort = list(x = "y", reverse = TRUE)
) |>
scale_y(percent = TRUE) |>
scale_color(type = "threshold", domain = 0.05)
```
New *diverging* color scales options :
```{r}
data(gistemp)
g <- obsplot(gistemp) |>
mark_dot(x = "Date", y = "Anomaly", stroke = "Anomaly") |>
mark_ruleY(0) |>
opts(grid = TRUE)
g |>
scale_color(
type = "diverging", scheme = "BuRd"
)
```
```{r}
g |>
scale_color(
type = "diverging", scheme = "BuRd", symmetric = FALSE
)
```
```{r}
g |>
scale_color(type = "diverging-sqrt")
```
New axis *line* option :
```{r}
obsplot() |>
opts(grid = TRUE, inset = 6) |>
scale_x(domain = "ABCDEFGH") |>
scale_y(domain = c(0, 1), line = TRUE)
```
### Facets
Empty facets are no longer rendered :
```{r}
library(palmerpenguins)
obsplot(penguins) |>
mark_dot(x = "bill_depth_mm", y = "bill_length_mm") |>
mark_frame() |>
facet(x = "sex", y = "species") |>
opts(grid = TRUE)
```
### Transforms
New *filter*, *sort* and *reverse* options to bin and group transforms *outputs* objects :
```{r}
data(sfcases)
df <- sfcases |> filter(case_disposition == "Death")
obsplot(df) |>
mark_areaY(
transform_binX(
list(y = "sum", filter = NULL),
x = "specimen_collection_date",
y = "case_count",
fill = "transmission_category",
curve = "step",
thresholds = JS("d3.utcWeek")
)
) |>
mark_ruleY(0)
```
New reducers in *bin* and *group* transforms :
```{r}
obsplot(trends2020, height = 900) |>
mark_areaY(x = "week", y = "interest", sort = list(fy = "y", reduce = "max-index")) |>
facet(y = "search", marginLeft = 160) |>
opts(label = NULL) |>
scale_x(axis = "top") |>
scale_y(axis = NULL)
```
*k* can be passed directly as first argument to window transforms :
```{r}
obsplot(gistemp) |>
mark_ruleY(0) |>
mark_line(transform_windowY(24, list(x = "Date", y = "Anomaly")))
```