等高线图绘制异常求助:基于变量计算的z值绘图为空
问题原因与修复方案
核心问题
- 数据结构不匹配等高线图要求:
plotly的contour和lattice的contourplot都需要x(nodes)和y(sumJ)构成规则二维网格,每个网格点对应唯一的z(WD)值。但你的数据是长格式,sumJ取值随nodes离散变化,无法形成规则网格,导致绘图时无法生成有效等高线。 - WD取值跨度极大:
dense="not"时WD最大约0.439,dense="fully"时WD最大可达100,两种情况的数值跨度悬殊,也是空图的诱因之一。
修复步骤
1. 简化数据生成逻辑
根据公式,WD可直接由sumJ和nodes计算,无需冗余变量,简化后的数据更清晰:
library(tidyverse) library(plotly) library(lattice) # 生成两种密度类型的数据 data_not <- expand.grid(nodes = seq(2, 455, by = 1), jaccard = seq(0.1, 100, by = 0.1)) %>% mutate(sumJ = (nodes-1)*jaccard, WD = 2 * sumJ / (nodes * (nodes - 1)), dense = "not") data_fully <- expand.grid(nodes = seq(2, 455, by = 1), jaccard = seq(0.1, 100, by = 0.1)) %>% mutate(sumJ = (nodes*(nodes-1)/2)*jaccard, WD = 2 * sumJ / (nodes * (nodes - 1)), dense = "fully") data <- bind_rows(data_not, data_fully) %>% select(nodes, sumJ, WD, dense) %>% distinct()
2. 适配数据特性的绘图方案
方式一:按密度类型分组绘制
将两种dense情况分开,避免数值跨度干扰:
Plotly 实现
# 绘制非完全密度的等高线(用jaccard替代sumJ,线性关系更清晰) plot_ly(data = data_not, x = ~nodes, y = ~jaccard, z = ~WD, type = "contour") %>% layout(title = "WD vs 节点数 & Jaccard(非完全密度)", xaxis = list(title = "节点数"), yaxis = list(title = "Jaccard"))
Lattice 实现
# 分面展示两种密度类型的等高线 contourplot(WD ~ nodes + jaccard | dense, data = data, main = "WD vs 节点数 & Jaccard(按密度类型分面)", xlab = "节点数", ylab = "Jaccard")
方式二:对sumJ取对数压缩范围
若必须用sumJ作为y轴,取对数可缩小数据跨度,让等高线显示:
# Plotly 对数sumJ版本 plot_ly(data = data, x = ~nodes, y = ~log10(sumJ), z = ~WD, type = "contour") %>% layout(title = "WD vs 节点数 & Log10(SumJ)", xaxis = list(title = "节点数"), yaxis = list(title = "Log10(SumJ)")) # Lattice 对数sumJ版本 contourplot(WD ~ nodes + log10(sumJ), data = data, main = "WD vs 节点数 & Log10(SumJ)", xlab = "节点数", ylab = "Log10(SumJ)")
备选:用散点图展示离散分布
如果数据本身是离散的,散点图比等高线更合适:
plot_ly(data = data, x = ~nodes, y = ~sumJ, color = ~WD, type = "scatter", mode = "markers") %>% layout(title = "WD分布(节点数 vs SumJ)")
内容的提问来源于stack exchange,提问作者Djoustaine
相关产品推荐
相关产品推荐

