2017-10-12 63 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

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