The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

upsetly

Interactive UpSet plots with plotly, with intersection details that can be copied easily in HTML documents (Quarto, R Markdown, Shiny).

upsetly focuses on UpSet-style visualization of set intersections (e.g. differential gene lists), and adds JavaScript hooks so that all tooltip text (Intersection, Size, Members, etc.) can be synced into a separate text box for copy‑and‑paste.


Installation

Until the first CRAN release is accepted, install the development version from GitHub:

# install.packages("remotes")
remotes::install_github("Rbunensi/upsetly")

Then load:

library(upsetly)

Basic idea

Given a data frame with:

upsetly() will:

  1. Compute all non-empty intersections across the set columns.
  2. Keep only intersections with size at least min_intersection_size.
  3. Optionally keep only the largest max_n_intersections intersections.
  4. Draw:
  5. Build rich tooltip text for each intersection, including:

In HTML output, you can also display the full tooltip text in a separate box which supports copy‑and‑paste.


Quick example

library(upsetly)

set.seed(1)
df <- data.frame(
  gene = paste0("g", 1:100),
  A = rbinom(100, 1, 0.3),
  B = rbinom(100, 1, 0.4),
  C = rbinom(100, 1, 0.2),
  stringsAsFactors = FALSE
)

p <- upsetly(
  x = df,
  set_cols = c("A", "B", "C"),
  id_col = "gene",
  max_n_intersections = 50,
  members_per_line = 10
)

p  # interactive plotly widget

This works in a regular RStudio viewer (or browser) as an interactive UpSet plot.


Using in Quarto / R Markdown with a copyable text box

To make the tooltip text (Intersection, Size, Members, etc.) easy to copy, you can add a small HTML element with id members_box and let upsetly() sync to it.

Example Quarto document

---
title: "upsetly demo"
format: html
---

```{r}
library(upsetly)
```
```{r}
set.seed(1)
df <- data.frame(
  gene = paste0("g", 1:100),
  A = rbinom(100, 1, 0.3),
  B = rbinom(100, 1, 0.4),
  C = rbinom(100, 1, 0.2),
  stringsAsFactors = FALSE
)

upsetly(
  x = df,
  set_cols = c("A", "B", "C"),
  id_col = "gene",
  max_n_intersections = 50,
  box_id = "members_box",
  members_per_line = 10
)
```
```{=html}
<pre id="members_box" style="
  border: 1px solid #ccc;
  padding: 8px;
  min-height: 120px;
  white-space: pre-wrap;
  font-family: monospace;
"></pre>
```

Interaction behavior

In the rendered HTML:

The content of members_box is pure text, so you can select and copy it easily.


Key arguments

upsetly(
  x,
  set_cols = NULL,
  id_col = NULL,
  min_intersection_size = 1,
  max_n_intersections = NULL,
  point_size = 8,
  bar_color_sets = "black",
  bar_color_inters = "black",
  active_color = "black",
  inactive_color = "lightgray",
  line_color = "black",
  title = "UpSet (plotly)",
  height = 500,
  width = NULL,
  members_per_line = 20,
  box_id = NULL
)

License

MIT © 2026 Anbunensi

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.