Plotly Surface图X轴刻度间距未按数值比例显示问题排查与解决
问题与解决方案
给定数据:hemi.csv
244,1000,1500,2000,2500,3000,3500,5000 0,14,18,-42,-72,-84,-86,-94,-119 12.5,277,231,185,139,144,150,161,158 25.1,416,394,370,348,361,374,404,396 37.6,483,587,633,653,566,585,633,621 49.8,504,612,733,756,668,691,748,734 62.4,504,612,733,756,786,749,809,794 74.9,504,612,733,756,786,814,854,838 100,504,612,733,756,786,814,880,864
Plotly 3D曲面图代码及问题
使用以下代码绘制3D曲面图:
import pandas as pd import plotly.graph_objects as go # 读取数据为DataFrame df = pd.read_csv('hemi.csv', header=0, index_col=0) # 提取曲面图所需数据 x_data = df.columns.tolist() y_data = df.index.tolist() z_data = df.values # 创建曲面图 fig = go.Figure(data=[go.Surface(z=z_data, x=x_data, y=y_data)]) # 更新布局,设置轴标题和刻度标签 fig.update_layout( scene = dict( xaxis = dict(title = 'RPM', tickmode = 'array', tickvals = x_data, ticktext = df.columns), yaxis = dict(title = 'TPS', tickmode = 'array', tickvals = y_data, ticktext = df.index), zaxis = dict(title = '扭矩(Nm)') ) ) fig.show()
运行后问题:Y轴(TPS)刻度间距符合索引值比例,但X轴(RPM)刻度间距均匀,未按列数值比例显示——例如3500-5000与3000-3500的渲染间距完全相同。
Matplotlib对比实现
使用Matplotlib的plot_trisurf绘制时,刻度均匀且绘图位置会按数值比例缩放:
import matplotlib.pyplot as plt from matplotlib import cm import pandas as pd # 读取数据(csv文件托管在网络上) data = pd.read_csv('413.csv', header=0, index_col=0) # 转换为长格式 df=data.unstack().reset_index() df.columns=["X","Y","Z"] fig = plt.figure() ax = fig.add_subplot(projection='3d') ax.plot_trisurf(df['Y'], df['X'], df['Z'], cmap=cm.jet, linewidth=0.2) plt.show()
解决方法
pandas默认会将表头值转为字符串类型,导致X轴刻度无法按数值比例渲染。解决方式是读取数据后显式转换表头类型:
df = pd.read_csv('413.csv', header=0, index_col=0).rename(columns=int)
修改后X轴的tickvals会按预期显示,最终效果符合要求。
内容的提问来源于stack exchange,提问作者R Schumacher
相关产品推荐
相关产品推荐

