如何更简便地在R绘图中添加data.frame作为文本框?
问题
我目前使用legend()函数手动将data.frame以文本框形式添加到R绘图中,请问是否存在更简便的实现方法?我查看了《Extent of boundary of text in R plot》相关链接但未找到有效帮助,我的实现代码如下:
plot(density(rnorm(1000)), xlab='x', ylab='y', lwd=1, main='Call', col='blue', type='l') lines(density(rnorm(1000, 0, 2)), lty=3, col='red') eo1 <- c(rnorm(1), rnorm(1), rnorm(1)) eo1 <- cbind(eo1, c(rnorm(1), rnorm(1), rnorm(1))) colnames(eo1) <- c('contextA', 'contextB') legend('topleft', legend=c(paste('medida', paste(colnames(eo1)[1:2], collapse=' ')) , paste('mean ', paste(sprintf('%+.3f', eo1[2, 1:2]), collapse=' ')) , paste('sk ', paste(sprintf('%+.3f', eo1[2, 1:2]), collapse=' ')) , paste('krtE ', paste(sprintf('%+.3f', eo1[3, 1:2]), collapse=' ')) ), horiz=F, cex=.7)
(附对应绘图示例图)
解决方案
这里提供几种更简便的实现方式,避免手动拼接文本的繁琐:
方法1:基础R自动格式化文本块
通过格式化函数自动对齐行名和数据,减少手动调整空格的工作量:
plot(density(rnorm(1000)), xlab='x', ylab='y', lwd=1, main='Call', col='blue', type='l') lines(density(rnorm(1000, 0, 2)), lty=3, col='red') # 构造带行名的数据框 eo1 <- data.frame( contextA = rnorm(3), contextB = rnorm(3) ) rownames(eo1) <- c('medida', 'mean', 'sk', 'krtE') # 生成表头和数据行,自动对齐 header <- paste(rownames(eo1)[1], paste(colnames(eo1), collapse=' ')) data_rows <- sapply(2:nrow(eo1), function(i) { paste0(format(rownames(eo1)[i], width=7), paste(sprintf('%+.3f', eo1[i, ]), collapse=' ')) }) legend_text <- c(header, data_rows) # 添加文本框 legend('topleft', legend=legend_text, cex=.7, bty='n') # bty='n'可去掉边框,按需调整
方法2:使用plotrix包直接添加表格
plotrix包的addtable2plot()可以直接将数据框转为表格添加到绘图中,无需手动拼接文本:
library(plotrix) plot(density(rnorm(1000)), xlab='x', ylab='y', lwd=1, main='Call', col='blue', type='l') lines(density(rnorm(1000, 0, 2)), lty=3, col='red') eo1 <- data.frame( contextA = rnorm(3), contextB = rnorm(3) ) rownames(eo1) <- c('mean', 'sk', 'krtE') # 把表格添加到左上角,可调整x/y位置、边框样式等 addtable2plot(x=min(par('usr')[1]), y=max(par('usr')[4]), table=eo1, bty='o', display.rownames=TRUE, hlines=TRUE, vlines=TRUE, cex=.7)
方法3:使用gridExtra包绘制自定义表格
如果需要更精细的样式控制,可结合gridExtra和grid包绘制表格:
library(gridExtra) library(grid) plot(density(rnorm(1000)), xlab='x', ylab='y', lwd=1, main='Call', col='blue', type='l') lines(density(rnorm(1000, 0, 2)), lty=3, col='red') eo1 <- data.frame( medida = c('mean', 'sk', 'krtE'), contextA = sprintf('%+.3f', rnorm(3)), contextB = sprintf('%+.3f', rnorm(3)) ) # 创建表格对象并绘制到指定位置(npc坐标范围0-1) table_grob <- tableGrob(eo1, rows=NULL, theme=ttheme_minimal(base_size=9)) grid.draw(table_grob, x=unit(0.15, 'npc'), y=unit(0.9, 'npc'))
内容的提问来源于stack exchange,提问作者xm1
相关产品推荐
相关产品推荐

