我有一个数据框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)
答案 0 :(得分: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')
图:
您可以在以后重命名轴。
ax.set_xticklabels(z1.columns)
ax.set_yticklabels(z1.index)