Shiny - печатные графики «ggsave» выглядят иначе, чем графики, отображаемые в блестящем приложении - PullRequest
0 голосов
/ 08 сентября 2018

Я сделал классное приложение Shiny, которое позволяет пользователям изменять размер своего графика и перемещать его по холсту.

Проблема в том, что иногда загруженный график выглядит совсем не так, как отображается на панели просмотра - он выглядит как квадратный рисунок, который может обрезать график, если вы измените масштаб и расположение.

Если вы рисуете его в масштабе 0,5, он выглядит одинаково в браузере и в загруженном PNG. - Но если вы сделаете его в масштабе 0,8 или даже просто в масштабе 1,0, он будет выглядеть идеально на панели просмотра, но уродливо и смещено при печати с помощью ggsave ().

Возможно, это вопрос о настройке параметров для ggsave? Или у меня фоновое изображение странного размера (1920 x 1028 пикселей)? Или, может быть, реактивная панель как-то сбрасывает ...? Я смущен в этом пункте.

В любом случае я нарисовал серый фон за областью графика, чтобы вы могли легко отличить холст от панели.

А вот минимальный воспроизводимый пример.

library(shiny)
library(tidyverse)
library(magick)
library(cowplot)


picture <- 'https://content.halocdn.com/media/Default/games/halo-5-guardians/map-images/arena/arena_maps_sustain_array04-bddc574f8e3445d08f24ef859fb96941.jpg'

background <- image_read(picture)



ui <- fluidPage(

   # Application title
   titlePanel("Old Faithful Geyser Data"),


   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),


      sliderInput("xposition",
                  "X-Axis Position",
                  min = -1,
                  max = 1,
                  value = 0,
                  step = 0.1),

      sliderInput("yposition",
                  "Y-Axis Position",
                  min = -1,
                  max = 1,
                  value = 0,
                  step = 0.1),

      sliderInput("scale",
                  "Chart Scale",
                  min = .25,
                  max = 1,
                  value = .5,
                  step = 0.1)),


      # Show a plot over grey background to see how canvas shifts
      mainPanel(style = "background:grey",

         plotOutput("distPlot"),
         downloadButton("downloadPlot", "Download")
      )
   )
)


server <- function(input, output) {

  xposition <- reactive({input$xposition})
  yposition <- reactive({input$yposition})
  scale <- reactive({input$scale})


  plot <- reactive({

    base_plot <- ggplot(faithful, aes(x = waiting), bins = input$bin) +
    geom_histogram()

    ggdraw() +
      draw_image(background) +
      draw_plot(base_plot, x = xposition(), y = yposition(), scale = scale())
    })

  ## Use Cowplot package to alter scale and position


  output$distPlot <- renderPlot({

      # draw the histogram with the specified number of bins
    plot()

   })

  output$downloadPlot <- downloadHandler(

    filename = "my_awesome_plot.png",
    content = function(file) {
      ggsave(file, plot())       

    }


  )
}

# Run the application 
shinyApp(ui = ui, server = server)

Если вы попробуете масштаб 0,5, масштаб 0,8 и масштаб 1,0, вы поймете, что я имею в виду!

Любая помощь ????

Примечание. Воспроизводимого примера, приведенного выше, должно быть достаточно, чтобы найти проблему, но если вы хотите увидеть более «глубокий» пример, вот мое настоящее приложение, в котором больше изображений и больше реактивного масштабирования и позиционирования.

https://jjohn987.shinyapps.io/Halo5_Stats/

Введите имя тега игрока (например, эти рабочие => hi, k, hairball9000 или другие теги игрока, которые используют люди, но без запятых или пробелов), и вы увидите, что то, что кажется «нижней» Сюжет сильно отличается от того, что находится в нижней части загрузки ... Имейте в виду, что я не подал заявку на какую-либо значительную пропускную способность API от Microsoft, поэтому время ожидания вызовов может зависеть от того, сколько людей пытаются помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...