2017-10-12 38 views
0

我有一个数据帧z1的条目如下:创建从熊猫三维表面光滑情节数据帧

z1.ix[1:10,1:3] 
      2017-04-01 2017-05-01 
2017-01-04   NaN 0.993549 
2017-01-05   NaN   NaN 
2017-01-06 0.830973 0.978463 
2017-01-09 0.926456   NaN 
2017-01-10 0.998371 0.997590 
2017-01-11 0.997539 0.999364 
2017-01-12 NaN   0.989801 
2017-01-13 0.999701 0.998526 
2017-01-16 0.995119 0.998891 

我试图创建一个使用排指标为X轴,列名称为Y的表面图轴和Z轴上的值。

我试过如下:

import matplotlib as mpl 
    import matplotlib.pyplot as plt 
    from mpl_toolkits.mplot3d import Axes3D 

    x = z1.columns 
    y = z1.index 
    X, Y = np.meshgrid(x, y) 
    Z = z1 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 
    ax.plot_surface(X, Y, Z) 

我获得以下错误:

TypeError: ufunc multiply cannot use operands with types dtype('float64') and dtype('<M8[ns]') 

无论是对我的数据框列名和行索引的日期时间。如何改进我的代码以制作3D SMOOTH曲面图。

z1.shape 
(182, 32) 

回答

1

我认为其中一些库不支持日期时间类型。
您应该先将数据转换为适当的格式。 这里是例子(抱歉IO的东西,它只是简单的复制粘贴数据帧)

from io import StringIO 
import pandas as pd 
import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

s = StringIO(""" 
      2017-04-01 2017-05-01 
2017-01-04   NaN 0.993549 
2017-01-05   NaN   NaN 
2017-01-06 0.830973 0.978463 
2017-01-09 0.926456   NaN 
2017-01-10 0.998371 0.997590 
2017-01-11 0.997539 0.999364 
2017-01-12 NaN   0.989801 
2017-01-13 0.999701 0.998526 
2017-01-16 0.995119 0.998891""") 
z1 = pd.DataFrame.from_csv(s, sep='\s+') 


def string_date_to_numeric(li): 
    series = pd.Series(li) 
    datetime = pd.to_datetime(series) 
    numeric = pd.to_numeric(datetime) 
    return numeric 


x = string_date_to_numeric(z1.columns) 
y = string_date_to_numeric(z1.index) 
X, Y = np.meshgrid(x, y) 
print(X, Y) 
Z = z1.values 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(X, Y, Z) 
fig.savefig('plot.png') 

图:

enter image description here

然后您可以重命名轴。

ax.set_xticklabels(z1.columns) 
ax.set_yticklabels(z1.index) 
+0

如何将坐标轴转换回日期格式? – Zanam

+0

添加到代码示例中,您可以设置大小,格式和其他一切。 –