knitr::opts_chunk$set( collapse = TRUE, comment = "#>", dpi = 300, fig.width = 1.8, fig.height = 1.8 )
The ggalignment
package does one thing -- it plot D&D-style alignment charts. If you're unfamiliar, this is what they look like:
library(ggalignment) library(dplyr) ggalignment(alignment = data.frame(img = character(), alignment = character()), font_size = 3)
Typically, each box contains an image of a person or thing. Each element of the chart should have a value in the x direction that represents how lawful or chaotic they are, and a value in the y direction that represents how good or evil they are. In this example, I've used some images of my cats and my perception of their alignments.
To plot one image per box, you only need to pass in a data.frame
containing two columns, img
and alignment
, which represent respectively the image path and the alignment name. For example:
align_cats <- example_cats()
If you pass this to the ggalignment()
function, it will plot each of these images in the center of each box.
ggalignment(align_cats, font_size = 3)
You can also provide images of different shapes (not just circles) and these will likewise center on the origin or use the x
and y
columns if provided.
cats_rect <- align_cats %>% mutate(img = c(align_cats$img[1:3], system.file("img/gray_2.png", package = "ggalignment"))) ggalignment(alignment = cats_rect, font_size = 3)
If you have more than one image per alignment box, or if you would just like further control over the placement of the image in the box, you can also provide columns x
and y
in your alignment
data passed to ggalignment()
which will specify the x and y coordinates for each image.
Within each box, the coordinate system extends from -1 to 1 in both axes, and is centered at the origin. We can modify the default plot by providing x
and y
columns.
cats_with_coords <- align_cats %>% mutate(x = c(0.5, -0.5, -0.5, 0.5), y = c(-0.5, -0.5, 0.5, 0.5)) ggalignment(alignment = cats_with_coords, font_size = 3)
This also works if there are multiple images per box, and x
and y
columns are required in this case to prevent two images occupying the same space at the origin and masking each other.
cats_with_multi_image <- align_cats %>% mutate(alignment = rep("chaotic neutral")) %>% mutate(x = c(0.5, -0.5, -0.5, 0.5), y = c(-0.5, -0.5, 0.5, 0.5)) ggalignment(alignment = cats_with_multi_image, font_size = 3)
You can adjust the image size using the parameters
max_images_per_dim
(defaults to "width") and max_image_dim
.
max_images_per_dim
controls how many images will fit per facet,
defaulting to how many fit width-wise. Depending on the ratio
of your images, you may want to switch max_images_dim
to "height",
which will control how many images will fit per facet height-wise.
Generally, you should pick the dimension that is larger.
These two parameters allow you to adjust the image size. For example, if I use max_images_per_dim = 1
with the default setting
of max_image_dim = "width"
, I will get an image that is the full width of the facet box.
ggalignment(alignment = align_cats, font_size = 3, max_images_per_dim = 1)
Setting max_images_per_dim = 2
will cause the images to take up 1/2 the width of the facet box.
ggalignment(alignment = align_cats, font_size = 3, max_images_per_dim = 2)
Likewise, max_images_per_dim = 4
will yield images that are 1/4 the width of the facet box. Controlling the image size is useful if you have a lot of images in a single box, and the default of max_images_per_dim = 2
will lead to overcrowding.
ggalignment(alignment = align_cats, font_size = 3, max_images_per_dim = 4)
You can change many things about the look of the chart, including
for the full list of acceptable arguments.
font size, font family, font color, background color, line color, and line type for the facets. These are all passed to ggplot()
, so see the documentation there
ggalignment(alignment = align_cats, line_type = "dotted", line_color = "seagreen1", background_color = "turquoise4", font_color = "skyblue1", font_size = 3)
If you want to use your own image files, just construct a data.frame containing an img
column containing the file paths, an alignment
column containing the alignments, and optionally x
and y
columns determining the location of each image within its alignment facet. If you have multiple images in a single alignment, x
and y
are required.
First, let's look at an example with local files. We'll use the R logo and a portrait of my cat Oberon (thank you to artist ChargedAsylum for the portrait!).
local_example <- data.frame(img = c("r_logo.png", "obie_portrait.png"), alignment = c("lawful good", "chaotic neutral")) ggalignment(local_example, font_size = 3)
You can also use a URL as your image path.
url_example <- data.frame(img = c("https://www.r-project.org/Rlogo.png", "https://avatars.githubusercontent.com/u/18043377?v=4"), alignment = c("lawful good", "chaotic neutral")) try({ # wrapped with a try block here to prevent CRAN issues ggalignment(url_example, font_size = 3) })
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.