it-swarm.com.de

Maßstab und Größe des Plots in RStudio glänzend

Verbunden, spricht aber nur über den zugewiesenen Plotplatz im Allgemeinen, nicht darüber, wie man die Plotbildgröße direkt einstellt und dann skaliert, um den gewünschten Platz auszufüllen


Ich erstelle eine glänzende Web-App und möchte die Größe des Plots festlegen und skalieren. Damit meine ich, dass ich nach einer Möglichkeit suche, eine endliche Höhe/Breite für meinen Plot festzulegen, und dann die Größe des Bildes auf den Bereich mainPanel( plotOutput ()) skaliere .

Nehmen Sie dies als Beispiel/analoge Situation außerhalb von 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()

Ich kann keine Bilder in SO und eine Größe festlegen, daher füge ich mit dem folgenden HTML-Code jeweils einen Browser-Screenshot hinzu:

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

Dies ist ein Screenshot in voller Breite auf meinem 1600 x 900 px großen Laptop.

Klein  smaller picture

Groß  bigger picture

Ich möchte die Größe des Bildes selbst steuern, da ich die Legenden ggplot2 Bei der Verwendung von Optionen wie colour = var Und size = var Als ziemlich klein empfinde. Beachten Sie die Schwierigkeit, Achsenbeschriftungen auch für das größere Bild zu lesen. Mir ist klar, dass ich möglicherweise in eine Situation gerate, in der sich die Größe des Bilds aufgrund begrenzter Pixel nicht gut skalieren lässt, aber ich denke, ich habe mindestens einiges Raum, um zu reisen, bevor ich darauf stoße.

Irgendwelche Vorschläge? Ich habe bisher versucht, mit den folgenden zu spielen, aber ohne Glück:

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

Es scheint, dass die in server.R Angegebenen Höhen-/Breitenoptionen alles überschreiben, was ich im Abschnitt plotOutput von ui.R Festgelegt habe.

Gibt es eine Möglichkeit, die Größe des Plotbilds zu verkleinern, um die Lesbarkeit zu erhalten, während der gewünschte Bereich mainPanel weiterhin ausgefüllt wird?

50
Hendy

Ich bin mir nicht sicher, ob dies Ihnen voll und ganz das gibt, was Sie sich wünschen, aber hier ist, was für mich funktioniert hat.

Die Optionen in Server.R ist in Kraft getreten. (Ich habe gerade zwei Diagramme mit jeweils unterschiedlicher Größe gezeichnet.) Ich habe auch @ Manetherans Vorschlag aufgegriffen und cex und cex.axis zu Parametern gemacht. Sie scheinen zu arbeiten.

Unten finden Sie den Code für die vollständige App sowie einen Screenshot.

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

Update wieder. die Option Breite = 100% in UI.R

Ja, in meinem Fall macht es definitiv einen Unterschied. In den beiden folgenden Zeilen sind new_main_plot und new_main_plot2 identisch, sie wurden jedoch mit unterschiedlichen Größen gerendert. Die Option width wird also wirksam.

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

Hoffentlich hilft das.

30
Ram Narasimhan

Die Antwort von @ Ram eignet sich hervorragend für das Zeichnungsdienstprogramm base.

Nur um für andere Passanten zu erweitern, dies mit ggplot zu tun:

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)

Zumindest etwas in dieser Richtung, je nachdem, was Sie wollen. Siehe diese Frage für die Grundidee, siehe jedoch die aktuelle ggplot2 0.9. Dokumentation zum Einstellen von Textoptionen - Sie können Achsentext, Legendentext und facet_grid-Streifen angeben Text usw.

Seit der vorherigen Frage SO) hat sich die Spezifikation von opts([option] = theme_text(size = n)) in theme([option] = element_text(size = n)) geändert. Sie wird sich wahrscheinlich erneut ändern ... suchen Sie also einfach den aktuellen Test/theme/options Seite für ggplot2.


Ich habe ein bisschen weiter herumgespielt, basierend auf @ Ram's Follow-up und denke, ich verstehe, wie ui.R Und server.R Zusammenwirken, indem ich verschiedene Optionen einstelle und den Inspect element In Chromium betrachte.

ui.R legt die verfügbare Plotfläche fest, die gefüllt werden kann, und server.R definiert die Plotgröße.

  • ui.R: Width = 100%, server.R: Keine Optionen festgelegt

enter image description here

  • ui.R: Breite = 100%, server.R: Breite = 800, Höhe = 600

enter image description here

  • ui.R: Breite = 50%, server.R: Breite = 800, Höhe = 600

enter image description here

  • ui.R: Breite = 200%, server.R: Breite = 800, Höhe = 600

enter image description here

Das letzte war alles, was ich sehen musste, um die Frage endgültig zu beantworten. Wenn Sie die Einstellungen replizieren, werden Sie feststellen, dass der Plotbereich <div> Tatsächlich 200% der Bildschirmbreite beträgt und eine horizontale Bildlaufleiste im Browser erstellt. Das Bild hat jedoch immer noch eine feste Größe.

Sie können jedoch can ein Bild erzeugen, das größer als der Plotbereich (in Pixel) ist, und es dann über ui.R Und die Angabe einer width = n % - Option verkleinern.

Also ... Ich kann kein kleineres Bild in Pixeln erstellen (wodurch ein größerer Text im Verhältnis zum gesamten Plot erstellt wird) und es dann größer machen, um größeren Text zu haben. Man muss in der Tat ein Diagramm mit der Größe des Plotbereichs (oder größer) erstellen und den Text über den Befehl plot (oder ggplot) selbst zur Zufriedenheit skalieren.

Zumindest derzeit kann man auch kein% für die Breite in server.R Angeben, vermutlich, weil die Optionen für Höhe/Breite an den Befehl png() übergeben werden, um das Bild zu generieren. Beim Versuch, dies zu tun, wird ein Fehler angezeigt (aber es war einen Versuch wert).

Ich bin nicht einverstanden, dass die Angabe der Textgrößenoptionen eine einfachere Route ist als die, nach der ich gesucht habe, aber zumindest habe ich etwas, das funktioniert. Mit pdf("file.pdf", width = 8, height = 6) mache ich die ganze Zeit das "Betrügen" für LaTeX-Dokumente, erstelle meinen Plot und skaliere ihn dann nach Belieben, wenn ich ihn in die .tex-Datei einbinde. Meiner Meinung nach viel einfacher, als für jede Handlung mit theme(axis.text = element_text(size = x)) zu fummeln.

16
Hendy