2014-10-09 21 views
14

Problema Sommario: grafici ggplot2 sembrano essere di scarsa qualità a lucido, quando ospitato su shinyapps.io. Gli elementi del grafico contengono difetti visibili, ad es. i punti di geom_point() non sono rotondi, alcuni sembrano triangoli, altri come rettangoli ecc. La leggenda sembra essere esplosa da un jpg a bassa risoluzione. Il mio esempio è here.ggplot2 qualità grafico in lucido su shinyapps.io

Domanda: ci sono delle opzioni per il controllo grafico di qualità, come ad esempio dpi?

Descrizione dettagliata: elaborare una semplice applicazione Brillante, ho notato che i grafici ggplot sono un po 'agitato attorno ai bordi, ed era incapace di migliorare la situazione. Lo example app lo dimostra abbastanza bene, nota come i puntini sembrano di forma irregolare. La loro forma migliora, approssimando la circolarità, quando aumento lo zoom (in Chrome) al 200% o più. Con lo zoom al 100%, l'intero grafico appare strano e non liscio. Come se quando una risoluzione dell'immagine viene diminuita del fattore 0,77 o qualcosa del genere, si ottengono piccoli artefatti di distorsione; l'effetto simile è qui. Il modo più semplice per vederlo è scaricare l'immagine al 100% di zoom (tasto destro, salva con nome), quindi aumentare lo zoom sulla copia locale. Vedrai come i punti sono lontani dall'essere rotondi. Il codice per server.R e ui.R è molto semplice:

# ui.R 

shinyUI(fluidPage(
    titlePanel("My Shiny App"), 
    sidebarLayout(
     sidebarPanel(
      h4("The graph looks rough")), 
     mainPanel(
      plotOutput("myplot",width=800,height=600) 
     ) 
    ) 
)) 

e

# server.R 

library(ggplot2) 
data(mtcars) 

shinyServer(
    function(input, output) { 
     output$myplot <- renderPlot({ 
      p <- ggplot(data=mtcars,aes(x=mpg,y=disp,color=factor(cyl))) 
      p <- p + geom_point() 
      print(p) 
     }) 
    } 
) 

io sono curioso di sapere se questo può essere migliorato. Shiny è un potente strumento per comunicare risultati scientifici, tuttavia l'effetto wow è in qualche modo minato da questi artefatti visivi. Grazie!

MODIFICA: probabilmente un modo più corretto per esprimere il problema è quello di dire che non c'è antialias nell'immagine PNG predefinita.

MODIFICA 2: per questa domanda è più importante per gli altri utenti SO, qui ci sono le schermate del grafico prima e dopo l'utilizzo del dispositivo Cairo (utilizzare lo zoom nel browser per ottenere un migliore sguardo alla differenza):

Without Cairo graph With Cairo graph

+7

Solo un'ipotesi, prova ad includere 'library (Cairo); options (shiny.usecairo = TRUE)' nel tuo server.R o in global.R. –

+0

@MatthewPlourde In realtà, ha funzionato come un fascino. Potresti sicuramente riformattare il tuo commento come risposta. –

+0

Considereresti di aggiungere prima e dopo le schermate? – bdemarest

risposta

5

Visto che siete probabilmente su un server basato su Linux, è probabile che sia necessario utilizzare la libreria grafica Cairo.

Cairo è una libreria di grafica 2D con supporto per più dispositivi di output. I target di output attualmente supportati includono X Window System (tramite Xlib e XCB), Quartz, Win32, buffer di immagini, output di file PostScript, PDF e SVG. I backend sperimentali includono OpenGL, BeOS, OS/2 e DirectFB. Cairo è progettato per produrre un output coerente su tutti i supporti di stampa sfruttando al tempo stesso l'accelerazione hardware del display quando disponibile (ad esempio tramite X Render Extension). Personalmente, lo uso per il canale alfa (opzioni di trasparenza).

Convenientemente, esiste un'implementazione R che crea un dispositivo grafico cairo nel pacchetto "Cairo". In effetti, devi aggiungere il seguente chunk a "server.R":

#install.packages("Cairo") 
library(Cairo) 
options(shiny.usecairo=T) 

Che dovrebbe farlo.

PS: Vedo che @MathewPlourde ha già risposto a questa domanda nei commenti.

+0

Ti è capitato di testarlo? È necessario 'options (shiny.usecairo = T)'? Penso che questo potrebbe essere impostato su "VERO" per impostazione predefinita. –

+0

Dipende dalla distribuzione. I valori predefiniti sono diversi per le versioni desktop e server, quindi il codice potrebbe non essere portabile se i dispositivi grafici o le impostazioni sono stati chiamati esplicitamente. In CentOS/RHEL Cairo dovrebbe essere l'impostazione predefinita, ma Shiny interagisce ancora stranamente con altre distribuzioni, quindi (1) assicurandosi che la libreria Cairo R sia installata e (2) chiamandola in modo esplicito possa risolvere i problemi causati dagli utenti che tentano di eseguire il debug e (ad esempio) impostazione accidentale di altri dispositivi grafici primari. –

+1

Ho appena provato su una stazione RHEL in realtà, e RSever non riesce a impostare Cairo e utilizza png invece per impostazione predefinita. Immagino che invochi il quarzo, e un po 'di default punta invece a png, bypassando Cairo. Senza antialiasing, sembra frastagliato. Esiste una performance hit/Cairo (circa + 20%), quindi se stai tracciando un sacco di punti, meglio avere le risorse sul server per tenere il passo. http://shiny.rstudio.com/reference/shiny/latest/plotPNG.html –

Problemi correlati