2017-08-14 1 views
4

Ich wurde gebeten, ein Kreisdiagramm mit ggplot2 neu erstellen und habe Schwierigkeiten beim Hinzufügen einer zweiten Beschriftung der Handlung. Ich brauche eine Beschriftung auf der unteren linken Seite des Grundstücks und die unten rechts.Fügen Sie eine zweite Beschriftung zu Polarkoordinaten basierend ggplot2 plot

Mein aktueller Ansatz kann das eine oder andere erhalten, indem die hjust Option für die Beschriftung Platzierung unter Verwendung von (0 für links-align; 1 für rechts-align):

library(ggplot2) 
dat <- data.frame(variable = c("V1", "V2", "V3"), 
        value = c(.80,.50,.63)) 
p1 <- ggplot(dat, 
      aes(x = 1, y = value, fill = variable)) + 
    geom_bar(stat = "identity") + 
    coord_polar(theta = "y") + 
    theme(legend.position = 'none', 
     plot.caption = element_text(hjust = 1)) + 
    labs(caption = "RIGHT CAPTION") 

print(p1) 

Dies erzeugt:

Pie chart with right caption

Ich habe einige Ansätze gesehen, die annotate() verwenden, aber ich kann nicht scheinen, sie mit coord_polar() zu arbeiten.

Weiß jemand, wie ich eine zweite Beschriftung auf der linken Seite des Diagramms (horizontal ausgerichtet mit der rechten Beschriftung) erhalten kann? Vielleicht ist es möglich, eine leere Ebene zu überlagern, die nur eine linke Beschriftung hat?

+0

Ich bin definitiv nicht Hacky Lösungen, die oben mit, aber ich hoffe, es eine Möglichkeit, dies zu tun ist, die ein bisschen mehr reproduzierbar ist. Diese Lösung würde viel Versuch und Irrtum mit der Anzahl der Leerzeichen zwischen den linken und rechten Beschriftungen erfordern und abhängig davon, wie das Diagramm gespeichert/exportiert wird, kann sich dieser Wert ändern. –

Antwort

3

Mit dem Paket grid ist es möglich, einen Text grob mit der linken Beschriftung hinzuzufügen.

library(ggplot2) 
library(grid) 
dat <- data.frame(variable=c("V1", "V2", "V3"), value=c(.80,.50,.63)) 

p1 <- ggplot(dat, aes(x = 1, y = value, fill = variable)) + 
    geom_bar(stat = "identity") + 
    coord_polar(theta = "y") + 
    theme(legend.position='none', plot.caption=element_text(hjust=1)) + 
    labs(caption="RIGHT CAPTION") 

# Generate a ggplot2 plot grob 
p2 <- ggplotGrob(p1) 
# Find the grob tree containing the right caption (as child) 
k <- which(p2$layout$name=="caption") 
# Copy the "right caption" text grob in grbTxt 
grbTxt <- p2$grobs[[k]]$children[[1]] 

# Modify content and position of the text grob 
grbTxt$label <- "LEFT CAPTION" 
grbTxt$name <- "GRID.text.left" 
grbTxt$x <- unit(0,"npc") 
grbTxt$hjust <- 0 
grbTxt$gp$col <- "red" 

# Add grbTxt (left caption) to the title grob containing the right caption 
p2$grobs[[k]] <- addGrob(p2$grobs[[k]],grbTxt) 
grid.draw(p2) 

enter image description here

+0

Sehr cool! Nur um das ein bisschen besser zu verstehen: In diesem Fall fügt 'addGrobs()' ein neues Kind zur Untertitelliste hinzu? Wenn ich das schnell durchgehen würde, hätte ich ursprünglich angenommen, dass es das in 'p2 $ grobs [[k]]' befindliche Zeug überschreiben würde. –

+1

@Twitch_City Ja, 'addGrobs' fügt der Beschriftung grob ein neues Kind hinzu (a' gTree'). Wir können 'p2 $ groabs [[k]]' nicht überschreiben, sonst verlieren wir die richtige (untergeordnete) Überschrift. –

Verwandte Themen