2017-09-24 10 views
1

[Begriffsklärung: Bitte beachten Sie, dass ich nicht zu fragen, wie der Titel zu zentrieren, für die es mehrere Antworten bereits gebucht]Wie zentriert man ein Plot im Fenster mit ggplot2? (Unabhängig von der Länge der Achsentitel, Legende, etc.)

Ich schaffe Bar Diagramme, die ggplot2 verwenden, und eine Sache, die ich nicht herausfinden konnte, ist, wie man das Diagramm selbst im Fenster zentriert, unabhängig von der Länge des vertikalen Achsenbeschriftungstextes (der je nach Datensatz variiert) oder der Anwesenheit (oder Abwesenheit)) einer Legende rechts neben dem Diagramm. Ich möchte, dass das Quadrat, das das Balkendiagramm enthält, immer in der Mitte meines Fensters ist. Dies ist so, dass wenn ich es exportiere, alle Diagramme in der Mitte der Folien in einer Präsentation sitzen, anstatt nach links oder rechts verschoben zu werden, basierend auf Text oder anderen Objekten in der Zeichnung zu beiden Seiten des Balkendiagramms.

Zum Beispiel, wenn es sehr kurze vertikale Achsenbeschriftungen und keine Legende gibt, wird das Diagramm in der Mitte des Fensters sein, wie ich es möchte. Aber wenn ich rechts eine Legende habe, dann schiebt es meine Karte nach links. Wenn ich lange Y-Achsen-Titel habe, schiebt es mein Diagramm nach rechts. Ich möchte aus anderen Gründen keine andere Legendenpositionierung verwenden, daher hoffe ich, einen Weg zu finden, die Rechtfertigung der Handlung selbst zu kontrollieren.

Vielen Dank im Voraus für Anregungen!

Hier ist ein Beispiel für den Code, der das Grundstück einschließlich einiger Beispieldaten erzeugt:

chtit <- "Example" 
l_labs <- c("","","") 
x_labs <- c("imagine that you had a really long label here", 
      "and that the long labels move your chart over", 
      "and mess up the alignment") 
ests <- c(.5,.3,.2) 
nerrs <- c(.05, .05, .05) 
perrs <- nerrs 

barchart.data <- data.frame(l_labs, x_labs, ests, nerrs, perrs) 

p<- ggplot(barchart.data, aes(x=x_labs, y=ests, fill=l_labs)) + 
geom_bar(stat="identity", color="#808080", position=position_dodge(), fill="#808080") + 
geom_text(aes(y=ests+perrs+0.02, label=sprintf("%1.1f%%", 100*ests)), vjust=0.5, hjust=0, size=5, color="white") + 
geom_errorbar(aes(ymin=ests-nerrs, ymax=ests+perrs), width=.2, position=position_dodge(.9), color="white", size=0.25) + 
labs(title=chtit, x= "", y = "Frequency") + theme_classic() + 
scale_y_continuous(limits = c(0,1.1), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1)) + 
theme(legend.position="none", legend.text = element_text(color = "white")) + 
theme(title = element_text(colour = "white")) + 
theme(axis.text = element_text(size=12, color = "white"), axis.line = element_line(color = "white")) + 
theme(axis.title = element_text(size=12, color = "white")) + 
coord_flip() + 
theme(panel.grid.major.x = element_line(colour = "white",size=0.25)) + 
theme(aspect.ratio = 1) + 
theme(panel.background = element_rect(fill = "#1e1e1e")) + 
theme(plot.background = element_rect(fill = "#1e1e1e"), plot.margin = unit(c(.5,.5,.5,.5), "in")) + 
guides(fill = guide_legend(reverse = TRUE)) 
print(p) 
+1

beachten Sie bitte den Code zu vereinfachen, und umfassen die Daten. Siehe http://repex.tidyverse.org –

+0

Ich hoffte, dass, da dies eine allgemeine Frage ist, die wahrscheinlich nicht spezifisch für die Nuancen meiner speziellen Tabelle ist, dass ich Vorschläge bekommen könnte. Ich lerne immer noch (und versuche auch, ein Ergebnis zu liefern, das für das Geschäft in einer fristgerechten Weise benötigt wird), also musste ich meinen Code "gut" machen, anstatt meinen Code "arbeiten" zu lassen :) – Bob

+1

Sie sind fehlende Möglichkeiten hier. Da wir kein "barchart.data" haben, können wir Ihr Beispiel nicht ausführen. Um Ihnen zu helfen, müssten wir einige gefälschte Daten erstellen, usw. Wenn Sie Mittel zum Generieren der Daten bereitstellen würden, würden Sie die Chancen maximieren, Antworten zu erhalten. Außerdem gibt es eine Menge Dinge im Code, die scheinbar nicht mit dem Problem zusammenhängen. Das Zuschneiden selbst wird auch anderen helfen. –

Antwort

3

Sie die Panel-Größe einstellen,

library(egg) 
set_panel_size(p, width= unit(6,"in"), height = unit(4,"in"), file = 'test.pdf') 
set_panel_size(p + theme(axis.text.y = element_blank()), width= unit(6,"in"), height = unit(4,"in"), file = 'test2.pdf') 

aber der Plot Panel nicht zentriert werden das Gerät, das zusätzliche Arbeit erfordert. Hier ist ein Ansatz:

library(egg) 
p2 <- p + theme(axis.text.y = element_blank()) 

g1 <- gtable_frame(ggplotGrob(p), width= unit(3,"in"), height = unit(2,"in")) 
g2 <- gtable_frame(ggplotGrob(p2), width= unit(3,"in"), height = unit(2,"in")) 


wrap <- function(g, fullwidth=unit(10, 'in')){ 

    ng <- grid::nullGrob() 
    ag <- arrangeGrob(g, left=ng, right = ng) 

    panel <- g$widths[2] 
    margin <- 0.5*(fullwidth - panel) 
    lw <- margin - g$widths[1] 
    rw <- margin - g$widths[3] 
    ag$widths[c(1,3)] <- unit.c(lw, rw) 
    ag 
} 

pdf("compare.pdf", width=10, height=4, bg = 'black') 
grid.draw(wrap(g1)) 
grid.newpage() 
grid.draw(wrap(g2)) 
dev.off() 

enter image description here

Verwandte Themen