web-dev-qa-db-fra.com

Échelle et taille de la parcelle dans RStudio brillant

En relation, mais ne parle que de l’espace de tracé alloué en général, et non comment définir directement la taille de l’image de tracé et alors l’adapter pour remplir l’espace souhaité


Je crée une application Web brillante et j'aimerais définir la taille de l'intrigue et échelle. Ce que je veux dire par là, c'est que je cherche un moyen de définir une hauteur/largeur finie pour mon tracé, et alors une échelle qui définit l'image de la taille sur la zone mainPanel( plotOutput ()) .

Prenez ceci comme exemple/situation analogue en dehors de shiny.

x <- 1:10
y <- x^2
png("~/Desktop/small.png", width = 600, height = 400)
plot(x, y)
dev.off()

png("~/Desktop/big.png", width = 1200, height = 800)
plot(x, y)
dev.off()

Je ne peux pas télécharger d'images vers SO et définir une taille, je vais donc inclure une capture d'écran du navigateur de chacune d'elles à l'aide du code HTML suivant:

<img src="file:///home/jwhendy/Desktop/file.png" width = "800px" />

Ceci est une capture d'écran pleine largeur sur mon ordinateur portable 1600 x 900 px.

Petit  smaller picture

Big  bigger picture

Je voudrais contrôler la taille de l'image elle-même, car je trouve le ggplot2 légendes lors de l’utilisation d’options telles que colour = var et size = var être assez petit. Notez également la difficulté de lire les étiquettes des axes pour une image plus grande. Je me rends compte que je risque de tomber dans une situation dans laquelle la taille de l'image est mal dimensionnée à cause du nombre limité de pixels, mais je pense que j'ai au moins quelques-uns suffisamment d'espace pour voyager avant que je ne rencontre ce problème.

Aucune suggestion? J'ai essayé de jouer avec les suivants jusqu'à présent, mais sans succès:

ui.R

shinyUI(pageWithSidebar(

headerPanel("Title"),

  sidebarPanel(),

  mainPanel(

     plotOutput(outputId = "main_plot", width = "100%"))

  ))

server.R

shinyServer(function(input, output) {

  x <- 1:10
  y <- x^2

  output$main_plot <- renderPlot({

    plot(x, y) }, height = 400, width = 600 )
} )

Il semble que les options hauteur/largeur spécifiées dans server.R _ remplace tout ce que j’ai défini dans la section plotOutput de ui.R.

Existe-t-il un moyen de réduire la taille de l'image du tracé pour maintenir la lisibilité tout en remplissant la zone mainPanel souhaitée?

50
Hendy

Je ne sais pas si cela vous donne pleinement ce que vous désirez, mais voici ce qui a fonctionné pour moi.

Les options spécifiées dans Server.R a pris effet. (Je viens de tracer deux graphiques de tailles différentes.) J'ai également pris la suggestion de @ Manetheran et fait de cex et de cex.axis des paramètres. Ils semblent travailler.

Vous trouverez ci-dessous le code de l'application complète, plus une capture d'écran.

###UI.R
shinyUI(pageWithSidebar(


  headerPanel("Title"),

  sidebarPanel(
    sliderInput(inputId = "opt.cex",
            label = "Point Size (cex)",                            
                min = 0, max = 2, step = 0.25, value = 1),
  sliderInput(inputId = "opt.cexaxis",
              label = "Axis Text Size (cex.axis)",                            
              min = 0, max = 2, step = 0.25, value = 1) 
),

  mainPanel(
    plotOutput(outputId = "main_plot",  width = "100%"),
    plotOutput(outputId = "main_plot2", width = "100%")
  )
))


###Server.R
shinyServer(function(input, output) {


  x <- 1:10
  y <- x^2

  output$main_plot <- renderPlot({    
    plot(x, y)}, height = 200, width = 300)


  output$main_plot2 <- renderPlot({
    plot(x, y, cex=input$opt.cex, cex.lab=input$opt.cexaxis) }, height = 400, width = 600 )
} )

enter image description here

Mise à jour re. l'option Largeur = 100% dans UI.R

Oui, dans mon cas, cela fait vraiment une différence. Dans les deux lignes ci-dessous, new_main_plot et new_main_plot2 sont identiques, mais ils ont été rendus avec des tailles différentes. Donc, l'option width prend effet.

 mainPanel(
    plotOutput(outputId = "new_main_plot",  width = "100%"),
    plotOutput(outputId = "new_main_plot2", width = "25%")
  )

J'espère que ça t'as aidé.

30
Ram Narasimhan

La réponse de @Ram fonctionne très bien pour l'utilitaire de traçage base.

Juste pour développer pour les autres passants, faire ceci avec ggplot:

p <- ggplot(data, aes(x = x, y = y)) + geom_point()
p <- p + theme(axis.text = element_text(size = 20)) # Tweak size = n until content
print(p)

Au moins quelque chose à cet effet, en fonction de ce que vous voulez. Voir cette question pour l'idée de base, mais veuillez vous référer à l'actuel ggplot2 0.9. documentation sur la définition des options de texte - vous pouvez spécifier le texte de l'axe, le texte de la légende, la bande facet_grid texte, etc.

Depuis la précédente question SO, la spécification est passée de opts([option] = theme_text(size = n)) à theme([option] = element_text(size = n)). Elle changera probablement à nouveau ... alors, il suffit de trouver le test/thème actuel. Page/options pour ggplot2.


J'ai joué un peu plus loin en me basant sur le suivi de @Ram et pense que je comprends comment ui.R Et server.R Interagissent en définissant différentes options et en regardant le Inspect element En chrome.

ui.R définit la zone de tracé disponible que vous pouvez remplir et server.R définit la taille du tracé.

  • ui.R: Width = 100%, server.R: Aucune option n'est définie

enter image description here

  • ui.R: Width = 100%, server.R: Width = 800, height = 600

enter image description here

  • ui.R: Width = 50%, server.R: Width = 800, height = 600

enter image description here

  • ui.R: Width = 200%, server.R: Width = 800, height = 600

enter image description here

Le dernier était tout ce que j'avais besoin de voir pour pouvoir répondre définitivement à la question. Si vous répliquez les paramètres, vous verrez que la zone de tracé <div> Correspond bien à 200% de la largeur de l'écran et crée une barre de défilement horizontale dans le navigateur ... mais l'image est toujours à sa taille fixe.

Cependant, vous pouvez générer une image plus grande que la zone de tracé (en pixels), puis la réduire via ui.R Et en spécifiant un width = n % Option.

Donc ... Je ne peux pas créer une image plus petite en pixels (ce qui crée une taille de texte plus grande par rapport au tracé global), puis l'agrandir pour avoir un texte plus gros. Il est en effet nécessaire de créer un graphique de la taille de la zone de tracé (ou plus grande) et d’adapter le texte à la satisfaction via la commande de tracé (ou ggplot) elle-même.

Il est également impossible de spécifier, du moins à l’heure actuelle, un% pour la largeur dans server.R, Probablement parce qu’il transmet les options hauteur/largeur à la commande png() pour générer l’image. Vous obtiendrez une erreur en essayant de le faire (mais cela en valait la peine).

Je ne suis pas d'accord pour dire que spécifier les options de taille de texte est un itinéraire plus facile que ce que je cherchais, mais au moins j'ai quelque chose qui fonctionne. Je fais tout le temps "tricher" pour les documents LaTeX avec pdf("file.pdf", width = 8, height = 6), créer mon tracé, puis le redimensionner comme je le souhaite en l'incluant dans le fichier .tex. Beaucoup plus simple, à mon avis, que de jouer avec theme(axis.text = element_text(size = x)) pour chaque parcelle.

16
Hendy