R packages · June 2026

ggWizard

A Shiny wizard for making ggplot2 charts from a CSV or Excel file without writing code. You check and clean the data, pick one of eight chart types and style it, then export it with the R script behind it.

ggWizard's customise step: label controls on the left and a live preview of a scatter plot of dissolved oxygen against water temperature on the right
kinds of chart, from bar charts to violins
8
steps from a spreadsheet to a saved chart
6
file formats out, PNG, PDF, SVG and JPEG
4

Intro

After FounderForge I wanted the same kind of guided app for getting a good chart out of a spreadsheet, a job far more people have. ggplot2 makes very good charts, but you have to write R to get them. ggWizard puts a step-by-step wizard in front of it.

You bring a CSV or Excel file, check the data, choose a chart, style it and save it. Along with the chart you get the ggplot2 code that draws it and a log of what you did. It’s built the same way as FounderForge, as a golem app inside an R package, so the two share their structure, down to how the files are named.

The ggWizard welcome screen, with buttons to start the wizard, open the help and see the about page
The welcome screen. Get Started opens the wizard.

Bring a spreadsheet

ggWizard reads CSV, XLSX and XLS. If an Excel file has more than one sheet, it lists them and you pick one. It also works out what each column holds, whether numbers, dates, categories, text or yes and no values, because that decides which charts make sense later.

There’s a sample workbook inside the package to try it with. It holds simulated bacteria monitoring data from eight sites around Lincoln, Nebraska, with 268 sampling events and 18 variables. Every screenshot here uses it.

The import step with the sample Excel file uploaded, the file format set to auto-detect, the sheet picker showing Sample Data and the header row option
Importing the sample workbook. The sheet picker only appears for Excel files.

What’s in the file

Step two is a summary before you plot anything: rows, columns, how many are numeric or dates and how much is missing. Below it is a table of every column with its type, how complete it is, how many distinct values it has and an example value.

The preview step: tiles showing 268 rows, 18 columns, 9 numeric columns, 1 date column and 0% missing, above a column summary table
268 rows, 18 columns and nothing missing. The type column is worth a glance before you go on.

Step three is optional cleaning. You can drop columns you don’t need and flag outliers by Z-score in the columns you pick. There’s a replicate check too, where you choose a grouping column and a measurement. It works out the coefficient of variation within each group and flags the groups above your threshold. Whatever you remove, it shows the size before and after, lets you download the cleaned file and has a reset button.

The filter and QC step with sections for column selection, outlier detection by Z-score and replicate variance
Filter and QC. Skip it if your data is already clean.

Pick a chart

There are eight kinds of chart: bar, line, time series, scatter, histogram, box, violin and area. You choose one and map columns to the x and y axes, with colour and separate panels as options. The preview redraws as you change things.

The scatter below is water temperature against dissolved oxygen, coloured by season. Warmer water holds less oxygen. Even the simulated data shows it.

The configure step: plot type set to Scatter, x axis Water_Temp_C, y axis Dissolved_Oxygen_mgL, colour by Season, with a live preview of the scatter plot
Choosing a scatter plot and mapping the columns.

One switch turns the static ggplot2 chart into an interactive plotly one, with hover and zoom. You can save that as an HTML file at the end.

Make it look right

The customise step holds most of the controls, in sections you open as you need them: labels, font, theme, legend, grid and axes. Each label’s text box appears when you switch it on.

Font sizes come as four presets, from small to extra large, that scale every bit of text together. There are also five base themes and palette presets, including Viridis and ColorBrewer. You can switch gridlines and axis lines on and off and set axis ranges, breaks, label angles and margins. Some settings only make sense for one kind of chart, such as the median line and mean marker on a box plot.

The customise step with a title, subtitle and axis titles filled in, and the preview showing them on the chart
Adding a title, a subtitle and proper axis titles.
The finished scatter plot: dissolved oxygen in milligrams per litre falling as water temperature rises, with points coloured by season
The chart as ggWizard saved it, 8 by 6 inches at 300 dpi.

Take it with you

The last step saves the chart as PNG, PDF, SVG or JPEG, at 150, 300 or 600 dpi and whatever size you set. Each save goes into a new timestamped folder, so nothing gets overwritten. You can also download any file on its own without saving anything to disk.

Two extras come with the chart by default, an R script and a run log. The script is plain ggplot2, so you can read exactly how the chart was built. Here’s the main part of the script it wrote for the chart above, trimmed a little:

p <- ggplot(data, aes(x = Water_Temp_C, y = Dissolved_Oxygen_mgL,
                      colour = Season, fill = Season)) +
  geom_point(size = 2.0, shape = 16) +
  theme_minimal(base_size = 12, base_family = "Arial") +
  labs(
    title    = "Dissolved oxygen falls as the water warms",
    subtitle = "Simulated monitoring data from eight sites in Lincoln, Nebraska",
    x        = "Water temperature (°C)",
    y        = "Dissolved oxygen (mg/L)"
  )

The run log records each step with a time: the file and sheet, the size of the data, the chart settings and whether it built.

The export step: output folder, file format buttons, quality options, width and height, switches for the R script, run log and interactive HTML, and previews of the final plot and the run log
Export, with the final chart and the run log side by side.

Where it’s at

ggWizard is version 0.1.0, and I’d call it early. It builds and passes R CMD check on r-universe for Linux and macOS, but it doesn’t have tests of its own yet.

You can install it from my r-universe:

install.packages("ggwizard",
  repos = c("https://ebenogoe.r-universe.dev", "https://cloud.r-project.org"))

library(ggwizard)
run_app()

The app opens in your browser. Click Get Started on the welcome screen and it walks you through the rest.

More work

2026R packages

FounderForge

A Shiny app that turns real marker data into an AlphaSimR founder population without writing R. Load a VCF, HapMap, numeric or PLINK file, check it, filter it and export what newMapPop() needs.

Tools: R · Shiny · golem · AlphaSimR · vcfR · data.table · ggplot2

2026Apps

Plotpin

An Android app for finding a plant again. I built it to walk back to bagged sorghum plants in a crossing block. Now it works for anyone who marks points in a field.

Tools: Kotlin · Jetpack Compose · Room · Paparazzi

2026Machine learning

Colony Counter

An Android app that counts bacterial colonies from plate photos, offline. Two small YOLO models do the counting, in about three quarters of a second a plate on my phone.

Tools: Python · Ultralytics YOLO26 · ONNX Runtime · Kotlin · Jetpack Compose · CVAT

2026Reverse engineering

FF Mod Studio

Tools for modding Freedom Fighters, a game from 2003. There's an editor for its textures and models, plus a Blender addon that sends edits back into the game.

Tools: C++17 · Dear ImGui · miniz · HLSL · Python · Blender

2026R packages

Linkmapper

A Shiny app for building genetic linkage maps and mapping QTL without writing code. It began as the final-year project of two colleagues and me at KNUST. Now it's an R package, with a hosted copy that runs in the browser.

Tools: R · Shiny · golem · onemap · R/qtl · ggiraph

2026R packages

Clusnalyst

A Shiny app for cluster analysis of marker, trait and sequence data. My colleagues and I built the first version at KNUST in 2022. In 2026 I rewrote it as an R package with a live demo.

Tools: R · Shiny · golem · ape · cluster · msa · ggtree · ggiraph

2026Codebreaking

The Voynich manuscript

A book about 600 years old, written in a script nobody can read. Here's what's known about it and why no codebreaker has cracked it, with a note on my own work.

Tools: Python · NumPy · SciPy