我试图在ggplot2中创建的图下方显示一些有关数据的信息。我想使用绘图的 X 轴坐标绘制 N 变量,但 Y 坐标需要距离屏幕底部 10%。事实上,所需的 Y 坐标已经作为 y_pos 变量存在于数据框中。
我可以想到 3 种使用ggplot2的方法:
1)在实际图下方创建一个空图,使用相同的比例,然后使用 geom_text 在空白图上绘制数据。这种方法有点工作,但非常复杂。
2)geom_text
用于绘制数据,但以某种方式使用 y 坐标作为屏幕的百分比(10%)。这将强制数字显示在图下方。我无法弄清楚正确的语法。
3) 使用 grid.text 显示文本。我可以轻松地将其设置在屏幕底部的 10% 处,但我不知道如何设置 X 坐标以匹配绘图。我尝试使用 grconvert 来捕获初始 X 位置,但无法使其正常工作。
下面是带有虚拟数据的基本图:
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
下面修改后的 gplot 显示了主题的数量,但是它们显示在图中。他们迫使 Y 尺度扩大。我想在图下方显示这些数字。
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
显示数字的另一种方法是在实际图下方创建一个虚拟图。这是代码:
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 )
但是,这非常复杂,并且很难针对不同的数据进行修改。理想情况下,我希望能够以屏幕百分比的形式传递 Y 坐标。