You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

保存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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:32:00