2014-10-09 14 views
14

Problem Podsumowanie: ggplot2 wykresy wydają się być złej jakości błyszczące, kiedy gospodarzem na shinyapps.io. Elementy wykresu zawierają widoczne defekty, np. kropki geom_point() nie są okrągłe, niektóre wyglądają jak trójkąty, inne jak prostokąty itp. Legenda wygląda tak, jakby została wysadzona z niskiej rozdzielczości JPG. Mój przykład to here.ggplot2 jakość wykres w błyszczące na shinyapps.io

Pytanie: czy są jakieś opcje kontroli jakości wykresu, takie jak dpi?

Szczegółowy opis: opracowanie prostego Shiny aplikację, zauważyłem, że ggplot wykresy są nieco szorstkie na brzegach i nie był zdolny do poprawy sytuacji. Model example app pokazuje to wystarczająco dobrze, zauważ, że kropki wydają się mieć nieregularny kształt. Ich kształt poprawia się, zbliżając się do okrągłości, kiedy zwiększam zoom (w Chrome) do 200% lub więcej. Przy powiększeniu 100% cały wykres wygląda dziwnie i nie jest gładki. Jakby, gdy rozdzielczość obrazu została zmniejszona o współczynnik 0,77 lub coś podobnego, otrzymasz niewielkie artefakty zniekształceń; podobny efekt jest tutaj. Najprostszym sposobem, aby to zobaczyć, jest pobranie obrazu z powiększeniem 100% (prawy przycisk myszy, zapisanie jako), a następnie zwiększenie powiększenia lokalnej kopii. Zobaczysz, jak kropki nie są okrągłe. Kod dla server.R i ui.R jest bardzo prosta:

# ui.R 

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

i

# 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) 
     }) 
    } 
) 

Jestem ciekaw, czy ten może ulec poprawie. Błyszczące jest potężnym narzędziem do przekazywania wyników naukowych, ale efekt wow jest w jakiś sposób podważany przez te wizualne artefakty. Dzięki!

EDYCJA: prawdopodobnie poprawniejszym sposobem na wyrażenie problemu jest stwierdzenie, że nie ma wygładzania krawędzi w domyślnym obrazie PNG.

EDYCJA 2: aby to pytanie miało większą wartość dla innych użytkowników SO, oto zrzuty ekranu wykresu przed i po użyciu urządzenia Cairo (użyj powiększenia w przeglądarce, aby lepiej przyjrzeć się różnicy):

Without Cairo graph With Cairo graph

+7

Tylko zgadnij, spróbuj dodać 'library (Cairo); options (shiny.usecairo = TRUE)' w twoim server.R lub w global.R. –

+0

@MatthewPlourde Właściwie to działało jak czar. Z pewnością możesz sformatować swój komentarz jako odpowiedź. –

+0

Czy rozważasz dodawanie przed i po zrzutach ekranu? – bdemarest

Odpowiedz

5

Skoro jesteś prawdopodobnie na serwerze opartym na systemie Linux, prawdopodobnie będziesz musiał użyć graficznego bibliotekę Cairo.

Kair jest biblioteką graficzną 2D z obsługą wielu urządzeń wyjściowych. Obecnie obsługiwane cele wyjściowe obejmują X Window System (przez Xlib i XCB), Quartz, Win32, bufory obrazów, PostScript, PDF i SVG. Do zaplecza eksperymentalnego należą OpenGL, BeOS, OS/2 i DirectFB. Kair zaprojektowano w taki sposób, aby uzyskać spójne dane wyjściowe na wszystkich nośnikach wyjściowych, jednocześnie korzystając z przyspieszenia sprzętowego wyświetlania, gdy jest ono dostępne (np. Za pośrednictwem rozszerzenia XRender Extension). Osobiście używam go dla kanału alfa (opcje przezroczystości).

Dogodnie, istnieje implementacja R, która tworzy urządzenie graficzne cairo w pakiecie "Kair". W efekcie musisz dodać następującą porcję do "server.R":

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

To powinno wystarczyć.

PS: Widzę, że @MathewPlourde już odpowiedział na to pytanie w komentarzach.

+0

Czy zdarzyło ci się to sprawdzić? Czy wymagane są opcje (shiny.usecairo = T)? Myślę, że może to być domyślnie ustawione na "TRUE". –

+0

Zależy od dystrybucji. Domyślne są różne wersje Desktop i Server, więc kod może nie być przenośny, jeśli urządzenia lub ustawienia graficzne zostały wywołane jawnie. W CentOS/RHEL Cairo powinno być domyślne, ale Shiny nadal oddziałuje dziwnie w/kilka innych dystrybucji, więc (1) upewniając się, że biblioteka Cairo R jest zainstalowana i (2) wywołując ją wyraźnie, może rozwiązać problemy spowodowane przez użytkowników próbujących debugować i (na przykład) poprzez przypadkowe ustawienie innych podstawowych urządzeń graficznych. –

+1

Właśnie wypróbowałem to na stacji RHEL, a RSever nie ustawił Cairo i domyślnie używa png. Domyślam się, że to wymaga kwarcu, a niektóre domyślnie wskazują to na png, omijając Kair. Bez antyaliasingu wygląda to na postrzępione. Nie jest hit wydajności w/Kair (około + 20%), więc jeśli masz dużo punktów, lepiej mieć zasoby na serwerze, aby nadążyć. http://shiny.rstudio.com/reference/shiny/latest/plotPNG.html –

Powiązane problemy