Anzeigen von Text unter dem von ggplot2 generierten Plot

Ich versuche, einige Informationen zu den Daten unterhalb des in erstellten Diagramms anzuzeigenggplot2. Ich möchte die Variable N mit der X-Achsen-Koordinate des Diagramms zeichnen, aber die Y-Koordinate muss 10% vom unteren Bildschirmrand entfernt sein. Tatsächlich sind die gewünschten Y-Koordinaten bereits als y_pos-Variable im Datenrahmen enthalten.

Ich kann mir 3 Ansätze überlegenggplot2:

1) Erstellen Sie ein leeres Diagramm unterhalb des tatsächlichen Diagramms, verwenden Sie denselben Maßstab und verwenden Sie dann geom_text, um die Daten über das leere Diagramm zu zeichnen.Dieser Ansatz Art von Arbeiten, ist aber äußerst kompliziert.

2) Verwenden Siegeom_text um die Daten zu zeichnen, benutze aber irgendwie die y-Koordinate als Prozent des Bildschirms (10%). Dies würde die Anzeige der Zahlen unter dem Plot erzwingen. Ich kann die richtige Syntax nicht herausfinden.

3) Verwenden Sie grid.text, um den Text anzuzeigen. Ich kann es leicht auf 10% vom unteren Rand des Bildschirms einstellen, aber ich kann nicht herausfinden, wie die X-Koordinate eingestellt ist, um mit der Darstellung übereinzustimmen. Ich habe versucht, grconvert zu verwenden, um die anfängliche X-Position zu erfassen, aber es gelang mir nicht, dass dies auch funktioniert.

Unten ist das Grunddiagramm mit den Dummy-Daten:

<code>graphics.off()      # close graphics windows   

library(car)
library(ggplot2)  #load ggplot
library(gridExtra) #load Grid
library(RGraphics) # support of the "R graphics" book, on CRAN

#create dummy data
test= data.frame(
  Group = c("A", "B", "A","B", "A", "B"), 
  x = c(1 ,1,2,2,3,3 ),
  y = c(33,25,27,36,43,25),
  n=c(71,55,65,58,65,58),
  y_pos=c(9,6,9,6,9,6)
  )

#create ggplot
p1 <- qplot(x, y, data=test, colour=Group) +
  ylab("Mean change from baseline") + 
  geom_line()+
  scale_x_continuous("Weeks", breaks=seq(-1,3, by = 1) ) +
  opts( 
        legend.position=c(.1,0.9))

#display plot
p1
</code>

Der geänderte Plot unten zeigt die Anzahl der Probanden an, sie werden jedoch IM Plot angezeigt. Sie erzwingen die Verlängerung der Y-Skala. Ich möchte diese Zahlen UNTER dem Plot anzeigen.

<code>    p1 <- qplot(x, y, data=test, colour=Group) +
  ylab("Mean change from baseline") + 
  geom_line()+
  scale_x_continuous("Weeks", breaks=seq(-1,3, by = 1) ) +
  opts( plot.margin = unit(c(0,2,2,1), "lines"),
        legend.position=c(.1,0.9))+
  geom_text(data = test,aes(x=x,y=y_pos,label=n))

p1
</code>

Ein anderer Ansatz zum Anzeigen der Zahlen besteht darin, ein Dummy-Diagramm unterhalb des tatsächlichen Diagramms zu erstellen. Hier ist der Code:

<code>graphics.off()      # close graphics windows   

library(car)
library(ggplot2)  #load ggplot
library(gridExtra) #load Grid
library(RGraphics) # support of the "R graphics" book, on CRAN

#create dummy data
test= data.frame(
  group = c("A", "B", "A","B", "A", "B"), 
  x = c(1 ,1,2,2,3,3 ),
  y = c(33,25,27,36,43,25),
  n=c(71,55,65,58,65,58),
  y_pos=c(15,6,15,6,15,6)
  )


p1 <- qplot(x, y, data=test, colour=group) +
  ylab("Mean change from baseline") + 
  opts(plot.margin = unit(c(1,2,-1,1), "lines")) +
  geom_line()+
  scale_x_continuous("Weeks", breaks=seq(-1,3, by = 1) ) +
  opts(legend.position="bottom",
       legend.title=theme_blank(),
       title.text="Line plot using GGPLOT") 
p1

p2 <- qplot(x, y, data=test, geom="blank")+
  ylab(" ")+
  opts(     plot.margin = unit(c(0,2,-2,1), "lines"),
            axis.line = theme_blank(), 
            axis.ticks = theme_segment(colour = "white"),           
            axis.text.x=theme_text(angle=-90,colour="white"),
            axis.text.y=theme_text(angle=-90,colour="white"),
            panel.background = theme_rect(fill = "transparent",colour = NA), 
            panel.grid.minor = theme_blank(),      
            panel.grid.major = theme_blank()
            )+
  geom_text(data = test,aes(x=x,y=y_pos,label=n)) 
p2

grid.arrange(p1, p2, heights = c(8.5, 1.5),             nrow=2 )
</code>

Dies ist jedoch sehr kompliziert und für unterschiedliche Daten nur schwer zu ändern. Idealerweise möchte ich Y-Koordinaten als Prozent des Bildschirms übergeben können.

 Sandy Muspratt02. Mai 2012, 08:43
annotation_custom () und codevon hier könnte dir helfen. Siehe unten.
 Taylor C. White17. Feb. 2016, 22:28
Siehe meine Antwort unten. Es ist definitiv einfacher als die akzeptierte Antwort.
 Brandon Bertelsen26. Jan. 2017, 18:01
In neueren Versionen von ggplot2 ist diese Funktionalität jetzt gemäß der folgenden Antwort integriert:stackoverflow.com/a/36036479/170352

Antworten auf die Frage(4)

-Pakets.

Version 0.5.0 des Cowplot-Pakets (auf CRAN) verarbeitet ggplot2-Untertitel mit der Funktion add_sub.

Benutze es so:

<code>  diamondsCubed <-ggplot(aes(carat, price), data = diamonds) + 
  geom_point() + 
  scale_x_continuous(trans = cuberoot_trans(), limits = c(0.2, 3),
                     breaks = c(0.2, 0.5, 1, 2, 3)) + 
  scale_y_continuous(trans = log10_trans(), limits = c(350, 15000),
                     breaks = c(350, 1000, 5000, 10000, 15000)) +
  ggtitle('Price log10 by Cube-Root of Carat') +
  theme_xkcd()


  ggdraw(add_sub(diamondsCubed, "This is an annotation.\nAnnotations can span multiple lines."))
</code>

Aktualisierte opts() wurde ersetzt durchtheme()

Im folgenden Code wird ein Basisplot mit einem breiteren Rand am unteren Rand des Plots gezeichnet. Der textGrob wird erstellt und dann mit annotation_custom () in den Plot eingefügt. Es sei denn, der Text ist nicht sichtbar, da er sich außerhalb des Diagrammfensters befindet. Die Ausgabe wird auf das Bedienfeld beschränkt. Aber mit dem Code von Baptistevon hierkann der Ausschnitt überschrieben werden. Die Position wird in Dateneinheiten angegeben, und beide Textbeschriftungen werden zentriert.

<code>library(ggplot2)
library(grid)

# Base plot
df = data.frame(x=seq(1:10), y = seq(1:10))
p = ggplot(data = df, aes(x = x, y = y)) + geom_point() + ylim(0,10) +
    theme(plot.margin = unit(c(1,1,3,1), "cm"))
p

# Create the textGrobs
Text1 = textGrob(paste("Largest x-value is", round(max(df$x), 2), sep = " "))
Text2 = textGrob(paste("Mean = ", mean(df$x), sep = ""))

p1 = p + annotation_custom(grob = Text1,  xmin = 4, xmax = 4, ymin = -3, ymax = -3) +
        annotation_custom(grob = Text2,  xmin = 8, xmax = 8, ymin = -3, ymax = -3)
p1

# Code to override clipping
gt <- ggplotGrob(p1)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)
</code>

Oder mitgrid Funktionen zum Erstellen und Positionieren des Etiketts.

<code>p
grid.text((paste("Largest x-value is", max(df$x), sep = " ")),
   x = unit(.2, "npc"), y = unit(.1, "npc"), just = c("left", "bottom"), 
   gp = gpar(fontface = "bold", fontsize = 18, col = "blue"))
</code>

Bearbeiten Oder fügen Sie mithilfe von gtable-Funktionen Text-Grob hinzu.

<code>library(ggplot2)
library(grid)
library(gtable)

# Base plot
df = data.frame(x=seq(1:10), y = seq(1:10))
p = ggplot(data = df, aes(x = x, y = y)) + geom_point() + ylim(0,10) 

# Construct the text grob
lab = textGrob((paste("Largest x-value is", max(df$x), sep = " ")),
   x = unit(.1, "npc"), just = c("left"), 
   gp = gpar(fontface = "bold", fontsize = 18, col = "blue"))


gp = ggplotGrob(p)

# Add a row below the 2nd from the bottom
gp = gtable_add_rows(gp, unit(2, "grobheight", lab), -2)

# Add 'lab' grob to that row, under the plot panel
gp = gtable_add_grob(gp, lab, t = -2, l = gp$layout[gp$layout$name == "panel",]$l)

grid.newpage()
grid.draw(gp)
</code>

 Atticus2918. Juni 2012, 18:56
Und wurden gemäß der Mailing-Diskussion über 0.9.0 alle Abhängigkeitsprobleme behoben?
 Sandy Muspratt19. Juni 2012, 04:52
@ Atticus29 Ich benutze kein Rstudio, deshalb kann ich dir nicht helfen. Es gibt ein Diskussionsforum auf derRstudio-Website. Die neueste Version von ggplot2 ist 0.9.1.
 Atticus2918. Juni 2012, 18:38
Ich habe das gleiche Problem. Wie erhalte ich die aktualisierte Version, wenn nicht von CRAN?
 Sandy Muspratt02. Mai 2012, 22:08
Es ist eine Funktion inggplot2. Welche Version von ggplot2 verwenden Sie? Möglicherweise müssen Sie ein Upgrade durchführen. Die neueste Version ist 0.9.0
 Max C02. Mai 2012, 14:06
Vielen Dank! Ich erhalte die Fehlermeldung: Funktion "ggplot_gtable" konnte nicht gefunden werden> gt $ layout $ clip [gt $ layout $ name == "panel"] <- "off"
 Max C03. Mai 2012, 05:04
Sandy: Irgendwie hat das R-Studio die ältere Version von GGPLOT installiert. Das tut mir leid.
 Max C02. Mai 2012, 02:47
Ich danke dir sehr!!! Mir ist klar, dass mit Grid-Funktionen Text überall auf dem Gerät platziert werden kann. Ich frage mich nur, ob dies möglich ist, Text UNTER den Plot zu platzieren, aber irgendwie die X-Koordinaten aus dem Plot zu verwenden. d.h. etwas Ähnliches wie mit der Textfunktion in Basis R.

+ labs(caption = "text"), die eine Anmerkung unterhalb des Diagramms anzeigt. Dies ist thematisch anpassbar (Schrifteigenschaften, ... links / rechts ausgerichtet). Sehenhttps://github.com/hadley/ggplot2/pull/1582 zum Beispiel.

Lösung für das Problem

Bearbeitet opts wurde veraltet, ersetzt durchtheme; element_blank hat ... ersetzttheme_blank; undggtitle() wird anstelle von verwendetopts(title = ...

Sandy - vielen Dank !!!! Das macht genau das, was ich will. Ich wünschte, wir könnten das Ausschneiden in geom.text oder geom.annotate steuern.

Ich habe das folgende Programm zusammengestellt, wenn jemand anderes daran interessiert ist.

<code> rm(list = ls())     # clear objects  
 graphics.off()      # close graphics windows   

library(ggplot2)
library(gridExtra)

#create dummy data
test= data.frame(
  group = c("Group 1", "Group 1", "Group 1","Group 2", "Group 2", "Group 2"), 
  x = c(1 ,2,3,1,2,3 ),
  y = c(33,25,27,36,23,25),
  n=c(71,55,65,58,65,58),
  ypos=c(18,18,18,17,17,17)

  )


p1 <- qplot(x=x, y=y, data=test, colour=group) +
  ylab("Mean change from baseline") + 
  theme(plot.margin = unit(c(1,3,8,1), "lines")) +
  geom_line()+
  scale_x_continuous("Visits", breaks=seq(-1,3) ) +
  theme(legend.position="bottom",
       legend.title=element_blank())+
   ggtitle("Line plot") 


# Create the textGrobs 
for (ii in 1:nrow(test))
{
  #display numbers at each visit
  p1=p1+ annotation_custom(grob = textGrob(test$n[ii]),  
                           xmin = test$x[ii], 
                           xmax = test$x[ii], 
                           ymin = test$ypos[ii], 
                           ymax = test$ypos[ii])

    #display group text
    if (ii %in% c(1,4)) #there is probably a better way 
      {
    p1=p1+ annotation_custom(grob = textGrob(test$group[ii]),  
                             xmin = 0.85, 
                             xmax = 0.85, 
                             ymin = test$ypos[ii], 
                             ymax = test$ypos[ii])
    }

  }




  # Code to override clipping
  gt <- ggplot_gtable(ggplot_build(p1))
  gt$layout$clip[gt$layout$name=="panel"] <- "off"
  grid.draw(gt)
</code>

 PatrickT05. Mai 2016, 11:36
Hier sieht es nicht so aus. Funktioniert der Code immer noch für Sie?

Ihre Antwort auf die Frage