I was cranking out a blog post for work earlier this week that shows off just how many integrations our platform has. I won’t blather about that content here, but as I was working on it, I really wanted to show off all the integrations.

A table seemed far too boring.

Several categorized unordered lists seemed too unwieldy.

Then, it dawned on me that I could make a visual representation of all the integration partners we have by thinking of the entire integrations’ ecosystem as a “universe” with each category being a “solar system” of that universe.

I’ve been leaning more heavily on javsascript for datavis these days, but I will always be more comfortable in {ggplot2}, so I headed to R to design a way to:

- generate concentric orbits for “n” solar systems
- randomize the placement of the planets in each ring
- make a decent plot!

I worked with one of the most amazing designers on the planet *(heh)* to come up with some stellar *(heh)* styling for it, and this was the result:

I took the styling guidance and wrapped the messy, individual functions I had into a new {ggsolar} package, you can find at https://github.com/hrbrmstr/ggsolar.

It’s pretty raw, and I need to “geomify” it at some point, but it has

- a function to generate the concentric circle polygons
- another one to identify a random point on each ring
- a naive plotting function, and
- a theme cleanup function for decent output.

The default is to generate uniformly distributed concentric circles, but you have the option of supplying a custom radii vector to make it more “real”/“solar-sysetm-y”.

Here’s the general flow:

```
# sol_planets is a built in vector of our system's planet names
sol_orbits <- generate_orbits(sol_planets)
set.seed(1323) # this produced a decent placements
# naive but it works! You can specify your own point picker, too.
placed_planets <- randomize_planet_positions(sol_orbits)
# do the thing!
plot_orbits(
orbits = sol_orbits,
planet_positions = placed_planets,
label_planets = TRUE,
label_family = hrbrthemes::font_es_bold
) +
hrbrthemes::theme_ipsum_es(grid="") +
coord_equal() +
labs(
title = "Sol",
caption = "Pluto is 100% a planet"
) +
theme_enhance_solar()
```

### Random Systems

I included a `generate_random_planets()`

function that uses a hidden Markov model to create believable planetary names, so you can now make your own universe with {ggplot2}!

```
set.seed(42)
(rando_planets <- generate_random_planets(12))
rando_orbits <- generate_orbits(rando_planets)
set.seed(123) # this produced decent placements
placed_planets <- randomize_planet_positions(rando_orbits)
plot_orbits(
orbits = rando_orbits,
planet_positions = placed_planets,
label_planets = TRUE,
label_family = hrbrthemes::font_es_bold
) +
hrbrthemes::theme_ipsum_es(grid="") +
coord_equal() +
labs(
title = "Rando System"
) +
theme_enhance_solar()
```

### FIN

Kick the tyres, use {gganimate} to make some animations, and be the ruler of your own universe! (We’re going to try to generate team “org charts” with these later in the week, so be creative, too!).

Pingback: Make “Solar System” Plots With {ggsolar} - Ciberdefensa