Sto tentando di visualizzare alcune informazioni sui dati sotto la trama creata in ggplot2. Vorrei tracciare la variabile N usando la coordinata dell'asse X del grafico, ma la coordinata Y deve essere del 10% dal fondo dello schermo. Infatti, le coordinate Y desiderate sono già nel frame di dati come variabile y_pos.Visualizzazione del testo sotto il grafico generato da ggplot2
mi viene in mente 3 approcci utilizzando ggplot2:
1) Creare un complotto vuota sotto la trama vera e propria, utilizzare la stessa scala e quindi utilizzare geom_text per tracciare i dati sopra la trama vuoto. This approach funziona ma è estremamente complicato.
2) Utilizzare geom_text
per tracciare i dati, ma in qualche modo utilizzare la coordinata come percentuale dello schermo (10%). Ciò costringerebbe i numeri a essere visualizzati sotto la trama. Non riesco a capire la sintassi corretta.
3) Utilizzare grid.text per visualizzare il testo. Posso facilmente impostarlo al 10% dalla parte inferiore dello schermo, ma non riesco a capire come impostare il coordindate X per adattarlo alla trama. Ho provato ad usare grconvert per catturare la posizione iniziale di X, ma non riuscivo a farlo funzionare.
Di seguito la trama di base con i dati manichino:
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
Il gplot modificato di seguito visualizza i numeri di soggetti, tuttavia essi vengono visualizzati all'interno della trama. Forzano la scala Y ad essere estesa. Mi piacerebbe mostrare questi numeri SOTTO la trama.
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
Un approccio diverso di visualizzare i numeri comporta la creazione di una trama fittizia sotto la trama vera e propria. Ecco il codice:
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)
enter code here
Tuttavia, questo è molto complicato e sarebbe difficile da modificare per dati diversi. Idealmente, mi piacerebbe essere in grado di passare le coordinate Y come percentuale dello schermo. Grazie in anticipo!
annotation_custom() e codice [da qui] (http://stackoverflow.com/questions/9690648/point-clipped-on-x-axis-in-ggplot) potrebbero aiutarti. Vedi sotto. –
Vedere la mia risposta qui sotto. È decisamente più semplice della risposta accettata. –
Le versioni recenti di ggplot2 ora hanno questa funzionalità integrata come da seguente risposta: http://stackoverflow.com/a/36036479/170352 –