0

i'm trying to build a dotplot with an image diplayed at every data point instead of just a bland point. I have tried many methods of introducing the data to R, and this is the closest ive gotten. In my data sheet I have a column with either NY_Male, NY_Female, OK_Male, or OK_Female on every point corresponding to which image id like displayed. Below is my code, and the error message displayed.

#import library
library(ggplot2)
library(beeswarm)
library(dunn.test)
library(ggimage)
library(png)
library(RCurl)
library(grid)

#set working directory
setwd("/Users/Documents//R")

#import data
data<-read.csv("parasite3_master.csv")

# Image
URL1 = "https://firebasestorage.googleapis.com/v0/b/tick-67255.appspot.com/o/Amblyomma_americanum_tick_blue_male.png?alt=media&token=fe30dc09-5a07-4fbd-b64e-7d90a8275eef"
NY__Male = readPNG(getURLContent(URL1))

## Image 2
URL2 = "https://firebasestorage.googleapis.com/v0/b/tick-67255.appspot.com/o/Amblyomma_americanum_tick_blue.png?alt=media&token=1e44e074-107b-4933-a6f5-9b1e81a17e9e"
NY__Female = readPNG(getURLContent(URL2))

# Image 3
URL3 = "https://firebasestorage.googleapis.com/v0/b/tick-67255.appspot.com/o/Amblyomma_americanum_tick.png?alt=media&token=d8863d57-12d8-4eb1-b86b-00dd21b33f07"
OK__Female = readPNG(getURLContent(URL3))

# Image 4
URL4 = "https://firebasestorage.googleapis.com/v0/b/tick-67255.appspot.com/o/Amblyomma_americanum_tick_green_male.png?alt=media&token=75519f09-30a6-4daa-b058-bf2430cc46d7"
OK__Male = readPNG(getURLContent(URL4))

# Crop the mal image
#NY_Male = NY_Male [40:250,,]

## Turn images into raster grobs
NY_Male = rasterGrob(NY__Male)
NY_Female = rasterGrob(NY__Female)
OK_Male = rasterGrob(OK__Male)
OK_Female = rasterGrob(OK__Female)

attach(NY_Male)
attach(NY_Female)
attach(OK_Male)
attach(OK_Female)

#check work
View(data)
summary(data)

#create data object
attach(data)

#Paste Function to combine location and sex
Categories <- paste(Location, Sex, sep=" ")

#Water Balance charts
#plot QH
WBplot <- ggplot(data , 
                 aes(y = DT, x = Categories , fill = Sex)) + 
  stat_summary(fun=mean,geom="errorbar",aes(ymax=..y..,ymin=..y..)) +
  geom_dotplot(binaxis='y', stackdir='center', position=position_dodge(1), dotsize = .5)+
  geom_image(aes(image=Image, size=0.015))
  ylab("Dehydration Tolerance (%)") +
  ylim(5,40) +
  theme(axis.text = element_text(size = 12),
        axis.title = element_text(size = 15, face = "bold"),
        axis.title.x = element_blank(),
        strip.text.x = element_text(size = 15),
        strip.text.y = element_text(size = 15),
        legend.position = "top",
        panel.background = element_rect(fill = "white", colour = NA),
        panel.border = element_rect(fill = NA, colour = "black"),
        strip.background = element_rect(colour = "black"))
WBplot

Error message displayed:

`Error in `geom_image()`:
! Problem while converting geom to grob.
ℹ Error occurred in the 3rd layer.
Caused by error:
! rsession-arm64: UnableToOpenBlob `NY_Male': No such file or directory @ error/blob.c/OpenBlob/2924`

I have tried attaching the image, and many other erronious things, but have never gotten past the error pasted above.

L Trimm5
  • 1
  • 1
  • Can you provide a subset of your actual data set, which we can use to try and reproduce your error? E.g. with the `dput` function, selecting a subset of your data. – C. Murtaugh Jun 27 '23 at 20:34

1 Answers1

0

We figured it out and had to change it to a local image while reformatting geom_image. See below.

# Load libraries
library(ggplot2)
library(ggimage)

# Set working directory
setwd("/Users/Documents/R")

# Import data
data <- read.csv("parasite3_master.csv")

# Define local file paths for the images
file_path_NY_Male <- "path_to_NY_Male.png"
file_path_NY_Female <- "path_to_NY_Female.png"
file_path_OK_Male <- "path_to_OK_Male.png"
file_path_OK_Female <- "path_to_OK_Female.png"

# Create the plot
WBplot <- ggplot(data, aes(y = DT, x = paste(Location, Sex), 
                 fill = Sex)) +
  stat_summary(fun = mean, geom = "errorbar",
               aes(ymax = ..y.., ymin = ..y..)) +
  geom_image(
    aes(
      image = ifelse(
        Sex == "Male" & Location == "NY", file_path_NY_Male,
        ifelse(Sex == "Female" & Location == "NY", file_path_NY_Female,
               ifelse(Sex == "Male" & Location == "OK", 
                      file_path_OK_Male, file_path_OK_Female))
      )
    ),
    size = 0.015,
    position = position_jitter(width = 0.2)
  ) +
  ylab("Dehydration Tolerance (%)") +
  ylim(5, 40) +
  theme(
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 15, face = "bold"),
    axis.title.x = element_blank(),
    strip.text.x = element_text(size = 15),
    strip.text.y = element_text(size = 15),
    legend.position = "top",
    panel.background = element_rect(fill = "white", colour = NA),
    panel.border = element_rect(fill = NA, colour = "black"),
    strip.background = element_rect(colour = "black")
  )

# Display the plot  

WBplot
greybeard
  • 2,249
  • 8
  • 30
  • 66
L Trimm5
  • 1
  • 1