Tah*_*sha 13 r viewport ggplot2 gridextra r-grid
我正在尝试将数据表添加到ggplot中创建的图形中(类似于excel功能,但可以灵活地将轴更改为on)
我已经做了一些事情,并继续遇到缩放的问题所以尝试1)
library(grid)
library(gridExtra)
library(ggplot2)
xta=data.frame(f=rnorm(37,mean=400,sd=50))
xta$n=0
for(i in 1:37){xta$n[i]<-paste(sample(letters,4),collapse='')}
xta$c=0
for(i in 1:37){xta$c[i]<-sample((1:6),1)}
rect=data.frame(xmi=seq(0.5,36.5,1),xma=seq(1.5,37.5,1),ymi=0,yma=10)
xta=cbind(xta,rect)
a = ggplot(data=xta,aes(x=n,y=f,fill=c)) + geom_bar(stat='identity')
b = ggplot(data=xta,aes(x=n,y=5,label=round(f,1))) + geom_text(size=4) + geom_rect(aes(xmin=xmi,xmax=xma,ymin=ymi,ymax=yma),alpha=0,color='black')
z = theme(axis.text=element_blank(),panel.background=element_rect(fill='white'),axis.ticks=element_blank(),axis.title=element_blank())
b=b+z
la=grid.layout(nrow=2,ncol=1,heights=c(0.15,2),default.units=c('null','null'))
grid.show.layout(la)
grid.newpage()
pushViewport(viewport(layout=la))
print(a,vp=viewport(layout.pos.row=2,layout.pos.col=1))
print(b,vp=viewport(layout.pos.row=1,layout.pos.col=1))
Run Code Online (Sandbox Code Playgroud)
哪个产生了

第二次尝试2)
xta1=data.frame(t(round(xta$f,1)))
xtb=tableGrob(xta1,show.rownames=F,show.colnames=F,show.vlines=T,gpar.corefill=gpar(fill='white',col='black'),gp=gpar(fontsize=12),vp=viewport(layout.pos.row=1,layout.pos.col=1))
grid.newpage()
la=grid.layout(nrow=2,ncol=1,heights=c(0.15,2),default.units=c('null','null'))
grid.show.layout(la)
grid.newpage()
pushViewport(viewport(layout=la))
print(a,vp=viewport(layout.pos.row=2,layout.pos.col=1))
grid.draw(xtb)
Run Code Online (Sandbox Code Playgroud)
哪个产生了

最后3)是
grid.newpage()
print(a + annotation_custom(grob=xtb,xmin=0,xmax=37,ymin=450,ymax=460))
Run Code Online (Sandbox Code Playgroud)
哪个产生了

其中选项2将是最好的,如果我可以将tableGrob缩放到与绘图相同的大小,但我不知道如何做到这一点.关于如何进一步采取行动的任何指示?- 谢谢
bap*_*ste 13
你可以试试新版本tableGrob; 得到的gtable宽度/高度可以设置为特定的大小(这里是等分布的npc单位)
library(ggplot2)
library(gridExtra)
library(grid)
tg <- tableGrob(head(iris), rows=NULL)
tg$widths <- unit(rep(1/ncol(tg),ncol(tg)),"npc")
tg$heights <- unit(rep(1/nrow(tg),nrow(tg)),"npc")
qplot(colnames(iris), geom="bar")+ theme_bw() +
scale_x_discrete(expand=c(0,0)) +
scale_y_continuous(lim=c(0,2), expand=c(0,0)) +
annotation_custom(ymin=1, ymax=2, xmin=-Inf, xmax=Inf, tg)
Run Code Online (Sandbox Code Playgroud)
JT8*_*T85 10
例如,您可以使用由ggplot创建的表,并将它们与此博客中的相似.我在这里做了一个简化的工作示例:
首先制作你的情节:
library(ggplot2)
library(reshape2)
library(grid)
df <- structure(list(City = structure(c(2L,
3L, 1L), .Label = c("Minneapolis", "Phoenix",
"Raleigh"), class = "factor"), January = c(52.1,
40.5, 12.2), February = c(55.1, 42.2, 16.5),
March = c(59.7, 49.2, 28.3), April = c(67.7,
59.5, 45.1), May = c(76.3, 67.4, 57.1),
June = c(84.6, 74.4, 66.9), July = c(91.2,
77.5, 71.9), August = c(89.1, 76.5,
70.2), September = c(83.8, 70.6, 60),
October = c(72.2, 60.2, 50), November = c(59.8,
50, 32.4), December = c(52.5, 41.2,
18.6)), .Names = c("City", "January",
"February", "March", "April", "May", "June",
"July", "August", "September", "October",
"November", "December"), class = "data.frame",
row.names = c(NA, -3L))
dfm <- melt(df, variable = "month")
levels(dfm$month) <- month.abb
p <- ggplot(dfm, aes(month, value, group = City,
colour = City))
p1 <- p + geom_line(size = 1) + theme(legend.position = "top") + xlab("")
Run Code Online (Sandbox Code Playgroud)
接下来在ggplot中生成数据表.使用与绘图相同的x轴:
none <- element_blank()
data_table <- ggplot(dfm, aes(x = month, y = factor(City),
label = format(value, nsmall = 1), colour = City)) +
geom_text(size = 3.5) +
scale_y_discrete(labels = abbreviate)+ theme_bw() +
theme(panel.grid.major = none, legend.position = "none",
panel.border = none, axis.text.x = none,
axis.ticks = none) + theme(plot.margin = unit(c(-0.5,
1, 0, 0.5), "lines")) + xlab(NULL) + ylab(NULL)
Run Code Online (Sandbox Code Playgroud)
将两者与视口组合:
Layout <- grid.layout(nrow = 2, ncol = 1, heights = unit(c(2,
0.25), c("null", "null")))
grid.show.layout(Layout)
vplayout <- function(...) {
grid.newpage()
pushViewport(viewport(layout = Layout))
}
subplot <- function(x, y) viewport(layout.pos.row = x,
layout.pos.col = y)
mmplot <- function(a, b) {
vplayout()
print(a, vp = subplot(1, 1))
print(b, vp = subplot(2, 1))
}
mmplot(p1, data_table)
Run Code Online (Sandbox Code Playgroud)
请注意,还需要进行一些调整,例如绘图图例的位置和表格中城市名称的缩写,但结果看起来不错:

适用于您的示例:
library(grid)
library(gridExtra)
library(ggplot2)
xta=data.frame(f=rnorm(37,mean=400,sd=50))
xta$n=0
for(i in 1:37){xta$n[i]<-paste(sample(letters,4),collapse='')}
xta$c=0
for(i in 1:37){xta$c[i]<-sample((1:6),1)}
rect=data.frame(xmi=seq(0.5,36.5,1),xma=seq(1.5,37.5,1),ymi=0,yma=10)
xta=cbind(xta,rect)
a = ggplot(data=xta,aes(x=n,y=f,fill=c)) + geom_bar(stat='identity')+ theme(legend.position = "top")+xlab("")
none <- element_blank()
z=ggplot(xta, aes(x = n, y = "fvalues",
label = round(f,1)) )+
geom_text(size = 3)+ theme_bw() +
theme(panel.grid.major = none, legend.position = "none",
panel.border = none, axis.text.x = none,
axis.ticks = none) + theme(plot.margin = unit(c(-0.5,
1, 0, 0.5), "lines")) + xlab(NULL) + ylab(NULL)
Layout <- grid.layout(nrow = 2, ncol = 1, heights = unit(c(2,
0.25), c("null", "null")))
grid.show.layout(Layout)
vplayout <- function(...) {
grid.newpage()
pushViewport(viewport(layout = Layout))
}
subplot <- function(x, y) viewport(layout.pos.row = x,
layout.pos.col = y)
mmplot <- function(a, b) {
vplayout()
print(a, vp = subplot(1, 1))
print(b, vp = subplot(2, 1))
}
mmplot(a, z)
Run Code Online (Sandbox Code Playgroud)

编辑:
类似丹尼斯他的解决方案,但比一个条形图和+ coord_flip().如果你不想翻转它,你可以删除后者,但它增加了可读性:
ggplot(xta, aes(x=n,y=f,fill=c)) +
geom_bar() +
labs(color = "c") +
geom_text(aes(y = max(f)+30, label = round(f, 1)), size = 3, color = "black") + coord_flip()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8710 次 |
| 最近记录: |