简体   繁体   中英

embed image: ggplot to plotly date issue

I am trying to convert the following ggplot image to plotly using ggplotly :

library(tidyverse)
library(ggimage)
library(plotly)
df <- data.frame(date = 
                   as.Date(c("01/01/1998", "10/01/1998", "15/01/1998", 
                             "25/01/1998", "01/02/1998", "12/02/1998", "20/02/1998"), "%d/%m/%Y"),
                 counts = c(12, 10, 2, 24, 15, 1, 14),
                 image = c(NA, "https://www.r-project.org/logo/Rlogo.png", NA, NA, 
                           "https://www.r-project.org/logo/Rlogo.png", NA, NA))
df
#         date counts                                    image
# 1 1998-01-01     12                                     <NA>
# 2 1998-01-10     10 https://www.r-project.org/logo/Rlogo.png
# 3 1998-01-15      2                                     <NA>
# 4 1998-01-25     24                                     <NA>
# 5 1998-02-01     15 https://www.r-project.org/logo/Rlogo.png
# 6 1998-02-12      1                                     <NA>
# 7 1998-02-20     14                                     <NA>

gg <- ggplot(df, aes(date, counts)) + 
  geom_line() +
  geom_image(aes(image = image), size = 0.05)
gg

在此处输入图像描述

I cant directly convert it using ggplotly because geom_image is not implemented in plotly :

ggplotly(gg, height = 700, width = 900)
# In geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) :
#   geom_GeomImage() has yet to be implemented in plotly.
#   If you'd like to see this geom implemented,
#   Please open an issue with your example code at
#   https://github.com/ropensci/plotly/issues

I think you need to go about it a different way by removing geom_image and adding in an image in layout . I don't know how to reference the locations of where the image should be though through (ie df$image ).

Even doing it manually I can't get one image on the graph:

gg2 <- ggplot(df, aes(date, counts)) + 
  geom_line() 

ggplotly(gg2, height = 700, width = 900) %>% 
  layout(
    images = list(
      list(source = "https://www.r-project.org/logo/Rlogo.png",
           xref = "paper", #https://plotly.com/r/reference/
           yref = "paper",
           x = .2, #as.Date(c("10/01/1998"), "%d/%m/%Y"),
           y = .2,
           sizex = 0.1,
           sizey = 0.1,
           opacity = 0.8
      )))

在此处输入图像描述

This solution suggests I need to work in a different date format but I can't get it to work either:

ggplotly(gg2, height = 700, width = 900) %>% 
  layout(
    images = list(
      list(source = "https://www.r-project.org/logo/Rlogo.png",
           xref = "x", #or paper
           yref = "y", #or paper
           x = as.numeric(as.POSIXct("10/01/1998", format = "%d/%m/%Y")), #or .3
           y = 10, #or .4
           sizex = 0.1,
           sizey = 0.1,
           opacity = 0.8
      )))

#or, reformat the x axis first
ggplotly(gg2, height = 700, width = 900) %>% 
  layout(xaxis = list(range = 
              c(as.numeric(as.POSIXct("01/01/1998", format="%d/%m/%Y"))*1000,
                as.numeric(as.POSIXct("20/02/1998", format="%d/%m/%Y"))*1000),
                type = "date"),
         images = list(
           list(source = "https://www.r-project.org/logo/Rlogo.png",
                xref = "x",
                yref = "y",
                x = as.numeric(as.POSIXct("10/01/1998", format="%d/%m/%Y"))*1000,
                y = 10,
                sizex = 0.1,
                sizey = 0.1,
                opacity = 0.8
           )))

#converting date from the outset using as.POSIXct doesn't help
#df$date <- as.numeric(as.POSIXct(df$date, format="%d/%m/%Y"))*1000

Any flexible suggests that allows me to reference all the points at which I want an image?

thanks

I'm not sure your issue is a date issue, as I couldn't get the image on the plot using layout.image , even when I used 1:7 instead of the dates, but then again I'm not a plotly expert. That said, I'm sure there are a few methods to get the image on the plot without using geom_image , here's one way which is not very clean - and could be inefficient with big dataframes- but it works with plotly:

library(ggplot2)
library(png)
library(RCurl)
library(plotly)
mydf <- data.frame(date = 
                   as.Date(c("01/01/1998", "10/01/1998", "15/01/1998", 
                             "25/01/1998", "01/02/1998", "12/02/1998", "20/02/1998"), "%d/%m/%Y"),
                 counts = c(12, 10, 2, 24, 15, 1, 14),
                 image = c(NA, "https://www.r-project.org/logo/Rlogo.png", NA, NA, 
                           "https://www.r-project.org/logo/Rlogo.png", NA, NA))
mydf

# You should find some way to compute your desired image height and image width
yHeight <- (max(mydf$counts) - min(mydf$counts)) * 0.05
xWidth <- (max(as.numeric(mydf$date)) - min(as.numeric(mydf$date))) * 0.05

# create the base plot
gg2 <- ggplot(mydf, aes(date, counts)) + 
  geom_line()

# for each row in the df
for (x in 1:nrow(mydf)) {
  row <- mydf[x, ]
  if(!is.na(row$image)){
    # read the image
    img <- readPNG(getURLContent(row$image))
    # add the image with annotation_raster
    gg2 <- gg2 + annotation_raster(img, 
                            xmin = as.numeric(row$date) - xWidth/2, 
                            xmax = as.numeric(row$date) + xWidth/2, 
                            ymin = row$counts - yHeight/2, 
                            ymax = row$counts + yHeight/2)
  }
}

ggplotly(gg2)

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM