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

无法用Plotly复现Matplotlib的3D曲面图问题求助

用Plotly复现Matplotlib 3D曲面图的解决方案

原Matplotlib实现代码

import matplotlib.pyplot as plt
import matplotlib.dates as dates

fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
ax.plot_trisurf(
    data3["strike"],
    dates.date2num(data3["expiration"]),
    data3["GEX"],
    cmap="seismic_r",
)
ax.yaxis.set_major_formatter(dates.AutoDateFormatter(ax.xaxis.get_major_locator()))
ax.set_ylabel("Expiration date", fontweight="heavy")
ax.set_xlabel("Strike Price", fontweight="heavy")
ax.set_zlabel("Gamma (M$ / %)", fontweight="heavy")
plt.show()

问题核心

Matplotlib的plot_trisurf支持直接处理非结构化离散散点数据,但Plotly的Surface组件要求输入的x、y、z必须是结构化二维网格数据:

  • x:一维数组(网格列坐标)或二维数组
  • y:一维数组(网格行坐标)或二维数组
  • z:严格对应每个(x,y)网格点的二维数值数组

你当前的代码中,z=[z,z]只是重复一维数组,并非真正的网格结构,加上x、y都是一维离散值,导致Plotly无法正确渲染曲面,仅显示单一y轴值。

解决步骤与Plotly代码实现

1. 将DataFrame转换为结构化网格

用pivot_table把离散数据重构为二维网格,行对应到期日,列对应行权价,值为GEX:

import plotly.graph_objects as go
import pandas as pd

# 透视数据生成二维网格,缺失值可按需填充(示例用0)
pivot_data = data3.pivot(
    index='expiration', 
    columns='strike', 
    values='GEX'
).fillna(0)

# 提取网格所需的x、y、z数据
x = pivot_data.columns.values  # 行权价(strike)
y = pivot_data.index.values    # 到期日(expiration)
z = pivot_data.values          # GEX二维数组

2. 绘制Plotly 3D曲面图

fig5 = go.Figure([go.Surface(
    z=z,
    x=x,
    y=y,
    opacity=0.95,
    connectgaps=False,
    colorscale='seismic_r',  # 匹配原Matplotlib的配色
    showscale=True,
    reversescale=False
)])

# 设置轴标签与日期格式化,对齐原图表样式
fig5.update_layout(
    scene=dict(
        xaxis_title='Strike Price',
        yaxis_title='Expiration date',
        zaxis_title='Gamma (M$ / %)',
        yaxis=dict(tickformat='%Y-%m-%d')  # 自定义日期显示格式
    )
)

fig5.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:53