You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用ggplot绘制二元函数?寻求更优3D或等高线图方案

优化双参数函数的可视化方案:ggplot等高线图 & 3D交互式图

嘿,我来给你分享几个比base R的image()更美观、更灵活的可视化方案,刚好匹配你想要的3D图和ggplot等高线图需求~

先修正下你现有代码里的小细节:outer()里用的contributor_idxsize_estimate应该对应前面定义的x_seqy_seq吧?我下面的示例会统一用x_seqy_seq来避免变量名混淆,原始代码格式化后是这样:

x_seq = seq(1, 1000)
y_seq = seq(1, 5000)
z = outer(x_seq, y_seq, function(x,y) log(y+1) + log(y+1)/log(x+1))
image(z)

方案一:ggplot2 美观等高线/填充热力图

ggplot2的优势是能轻松调整样式、添加标签,生成符合出版标准的可视化图。核心是把矩阵格式的z转换成长格式数据框,再用填充或等高线图层展示:

代码示例(填充热力图+等高线)

library(ggplot2)
library(tidyr) # 用于数据格式转换

# 把z矩阵转换成长格式数据框
z_df <- as.data.frame(z)
colnames(z_df) <- y_seq
z_df$x <- x_seq
z_long <- pivot_longer(z_df, cols = -x, names_to = "y", values_to = "z")
z_long$y <- as.numeric(z_long$y) # 把y转成数值型

ggplot(z_long, aes(x = x, y = y, fill = z)) +
  geom_tile() + # 填充色块
  geom_contour(color = "white", size = 0.3) + # 添加白色等高线区分层级
  scale_fill_viridis_c(option = "plasma") + # 使用更美观的颜色映射
  labs(x = "Contributor Index", y = "Size Estimate", fill = "Function Value") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

如果更偏好纯分区等高线图,可以把geom_tile()换成geom_contour_filled(),生成带颜色区块的分层等高线:

ggplot(z_long, aes(x = x, y = y, z = z)) +
  geom_contour_filled(bins = 15) +
  labs(x = "Contributor Index", y = "Size Estimate", fill = "Value Range") +
  theme_minimal()

方案二:交互式3D表面图(plotly)

如果想直观查看函数的三维形态,用plotly生成交互式3D图是绝佳选择,支持旋转、缩放、悬停查看具体数值:

代码示例

library(plotly)

# 直接用x_seq、y_seq和z矩阵生成3D表面图
plot_ly(
  x = x_seq,
  y = y_seq,
  z = z,
  type = "surface",
  colorscale = "Plasma"
) %>%
  layout(
    scene = list(
      xaxis = list(title = "Contributor Index"),
      yaxis = list(title = "Size Estimate"),
      zaxis = list(title = "Function Value")
    ),
    title = "3D Surface of Your Bivariate Function"
  )

这个图可以用鼠标拖拽旋转视角,滚轮缩放,悬停在表面上还能看到具体的x、y、z数值,比静态图更直观~


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

火山引擎 最新活动