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

R语言绘制资产时间分布3D图失败:仅显示灰色框求助

银行资产3D曲面图灰色框问题解决办法

问题出在哪

你的代码只显示灰色框,主要是这三个原因:

  • Plotly的3D曲面图对日期格式的y轴支持不佳,得转成数值型才能正常识别
  • 银行资产值跨度极大(从百万到万亿级别),而密度值极小,渲染时缩放异常导致曲面无法正常显示
  • 矩阵维度与轴的匹配逻辑错误,Plotly要求z矩阵的行数对应y轴长度,列数对应x轴长度,原代码的转置逻辑搞反了

一步步改代码解决

1. 把日期转成数值型时间索引

将日期转换为距离最早日期的天数,让Plotly能正确识别y轴维度:

# 替换原time_unique的定义
time_unique <- sort(unique(densities$REPDTE))
# 转成数值型:距离最早日期的天数
y_values <- as.numeric(time_unique - min(time_unique))

2. 修正矩阵维度和填充逻辑

重新构建密度矩阵,确保维度与x、y轴匹配:

# 矩阵行数对应时间点数量,列数对应资产值数量
density_matrix <- matrix(NA, nrow = length(y_values), ncol = length(x_values))

for (i in 1:length(y_values)) {
  subset_data <- densities %>% filter(REPDTE == time_unique[i])
  # 将每个时间点的密度值对齐到统一的x_values
  approx_result <- approx(subset_data$density_x, subset_data$density_y, xout = x_values, rule = 2)
  density_matrix[i, ] <- approx_result$y
}

3. 优化资产值显示(推荐操作)

由于资产值跨度太大,对x轴取对数能让曲面细节更清晰:

# 过滤非正资产值(银行资产应为正数),然后取对数
x_values <- sort(unique(densities$density_x[densities$density_x > 0]))
x_values_log <- log10(x_values)

# 用对数后的x值重构矩阵
density_matrix <- matrix(NA, nrow = length(y_values), ncol = length(x_values_log))

for (i in 1:length(y_values)) {
  subset_data <- densities %>% filter(REPDTE == time_unique[i], density_x > 0)
  approx_result <- approx(subset_data$density_x, subset_data$density_y, xout = x_values, rule = 2)
  density_matrix[i, ] <- approx_result$y
}

4. 修正绘图代码

替换原plot_ly部分,用处理后的数据生成图形:

# 用对数资产值的版本(不想用对数就把x换成x_values)
p1 <- plot_ly(x = x_values_log, 
              y = y_values, 
              z = density_matrix,
              type = "surface") %>%
  layout(title = "银行资产密度随时间变化3D曲面图",
         scene = list(xaxis = list(title = "资产值(对数刻度,10^x)"),
                      yaxis = list(title = "时间",
                                   # 把数值天数转回日期显示,方便阅读
                                   ticktext = format(time_unique, "%Y-%m-%d"),
                                   tickvals = y_values),
                      zaxis = list(title = "密度")))
# 显示图形
p1

额外检查点

  • 先检查densities数据框是否有大量空值,运行sum(is.na(densities))即可,有空值先过滤
  • 如果仍显示灰色框,尝试缩小资产值范围,比如只保留100万到1万亿之间的数据:
densities_filtered <- densities %>% filter(density_x >= 1e6, density_x <= 1e12)
x_values <- sort(unique(densities_filtered$density_x))

内容的提问来源于stack exchange,提问作者JF96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:12:05