保存lattice包多层levelplot数组为PNG:尺寸与间距问题
解决Lattice levelplot网格布局导出PNG混乱问题
问题根源
你当前代码混用了Base绘图系统的par()和Lattice的split布局机制,导致导出时布局冲突;同时每个子图都添加colorkey=TRUE,严重挤占了子图的显示空间,最终出现图形过小、间距失调的问题。
解决步骤
- 移除Base绘图相关的
plot.new()、par()、title(),改用Lattice原生的布局控制 - 只保留一个全局色键,避免重复占用空间
- 为导出的PNG设置合适的尺寸和分辨率,保证子图大小适中
- 统一调整子图的标签、字体大小,优化布局紧凑度
修改后的完整代码
library(lattice) library(viridis) # 生成矩阵数据 m1 <- rbind(c(0,3,4.5,4),c(3,0,3.5,4.8),c(4.5,3.5,0,5.2),c(4,4.8,5.2,0)) m2 <- rbind(c(0,2,2.5,3),c(2,0,3.2,3),c(2.5,3.2,0,3.2),c(3,3,3.2,0)) m3 <- rbind(c(0,4,5.5,5),c(4,0,4.5,5.8),c(5.5,4.5,0,5.2),c(5,5.8,5.2,0)) m4 <- rbind(c(0,2.5,4.5,4),c(2.5,0,4,4.8),c(4.5,4,0,5.2),c(4,4.8,5.2,0)) m5 <- rbind(c(0,3,5,6),c(3,0,3.5,5.2),c(5,3.5,0,5.2),c(6,5.2,5.2,0)) m6 <- rbind(c(0,7,5.5,6),c(7,0,6.5,4.9),c(5.5,6.5,0,5.2),c(6,4.9,5.2,0)) m7 <- rbind(c(0,1,2,2),c(1,0,1,2),c(2,1,0,5),c(2,2,5,0)) m8 <- rbind(c(0,3,5.8,4),c(3,0,4.2,5.8),c(5.8,4.2,0,4.1),c(4,5.8,4.1,0)) m9 <- rbind(c(0,0,0,1),c(0,0,1,1),c(0,1,0,0),c(1,1,0,0)) m10 <- rbind(c(0,2.3,4,4),c(2.3,0,3.5,3),c(4,3.5,0,2),c(4,3,2,0)) m11 <- rbind(c(0,1.1,1.2,1.1),c(1.1,0,1.5,1.3),c(1.2,1.5,0,0.9),c(1.1,1.3,0.9,0)) m12 <- rbind(c(0,5,6,7),c(5,0,6.7,4.2),c(6,6.7,0,5.2),c(7,4.2,5.2,0)) m13 <- rbind(c(0,4.6,4.5,7),c(4.6,0,5.9,2.5),c(4.5,5.9,0,5.2),c(7,2.5,5.2,0)) m14 <- rbind(c(0,7.9,6.2,7.9),c(7.9,0,7,6.7),c(6.2,7,0,5.2),c(7.9,6.7,5.2,0)) m15 <- rbind(c(0,2.3,2,3.7),c(2.3,0,3,1.9),c(2,3,0,3),c(3.7,1.9,3,0)) m16 <- rbind(c(0,0.7,2,2.1),c(0.7,0,0.8,1.6),c(2,0.8,0,2),c(2.1,1.6,2,0)) # 颜色设置 col_l <- colorRampPalette(viridis(10)) color_steps <- seq(0,8, by=0.01) # 自定义全局主题,调整字体和间距 my_theme <- standard.theme(color = TRUE) my_theme$plot.symbol$cex <- 0.8 my_theme$axis.text$cex <- 0.7 my_theme$par.xlab.text$cex <- 0.8 my_theme$par.ylab.text$cex <- 0.8 my_theme$layout.heights$top.padding <- 1 my_theme$layout.widths$right.padding <- 2 # 保存PNG文件,设置合适尺寸 trellis.device(png, file = 'toy_matrices.png', width = 16, height = 8, res = 150) # 绘制第一行6个图 print(levelplot(m1, at=color_steps, col.regions=col_l, xlab="mat1", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(1, 1, 6, 3), more=TRUE) print(levelplot(m2, at=color_steps, col.regions=col_l, xlab="mat2", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(2, 1, 6, 3), more=TRUE) print(levelplot(m3, at=color_steps, col.regions=col_l, xlab="mat3", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(3, 1, 6, 3), more=TRUE) print(levelplot(m4, at=color_steps, col.regions=col_l, xlab="mat4", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(4, 1, 6, 3), more=TRUE) print(levelplot(m5, at=color_steps, col.regions=col_l, xlab="mat5", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(5, 1, 6, 3), more=TRUE) print(levelplot(m6, at=color_steps, col.regions=col_l, xlab="mat6", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(6, 1, 6, 3), more=TRUE) # 绘制第二行6个图 print(levelplot(m7, at=color_steps, col.regions=col_l, xlab="mat7", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(1, 2, 6, 3), more=TRUE) print(levelplot(m8, at=color_steps, col.regions=col_l, xlab="mat8", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(2, 2, 6, 3), more=TRUE) print(levelplot(m9, at=color_steps, col.regions=col_l, xlab="mat9", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(3, 2, 6, 3), more=TRUE) print(levelplot(m10, at=color_steps, col.regions=col_l, xlab="mat10", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(4, 2, 6, 3), more=TRUE) print(levelplot(m11, at=color_steps, col.regions=col_l, xlab="mat11", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(5, 2, 6, 3), more=TRUE) print(levelplot(m12, at=color_steps, col.regions=col_l, xlab="mat12", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(6, 2, 6, 3), more=TRUE) # 绘制第三行4个图 print(levelplot(m13, at=color_steps, col.regions=col_l, xlab="mat13", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(1, 3, 6, 3), more=TRUE) print(levelplot(m14, at=color_steps, col.regions=col_l, xlab="mat14", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(2, 3, 6, 3), more=TRUE) print(levelplot(m15, at=color_steps, col.regions=col_l, xlab="mat15", ylab=NULL, colorkey=FALSE, par.settings = my_theme), split=c(3, 3, 6, 3), more=TRUE) # 最后一个图添加全局色键 print(levelplot(m16, at=color_steps, col.regions=col_l, xlab="mat16", ylab=NULL, colorkey=list(space="right"), par.settings = my_theme), split=c(4, 3, 6, 3), more=FALSE) # 添加全局标题 trellis.title(main = "Matrices", cex = 1.2) dev.off()
R Markdown编织时的额外设置
如果在Rmd中直接编织,建议在代码块中指定图形尺寸,避免布局错乱:
```{r fig.width=16, fig.height=8, dpi=150} # 上面的完整代码(去掉trellis.device和dev.off)
内容的提问来源于stack exchange,提问作者Kai Shaman
相关产品推荐
相关产品推荐

