无法用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
相关产品推荐
相关产品推荐

