我在使用pandas转换数据以便在matplot lib中呈现三维数据时遇到了一些困难。我通常拥有的数据是数字列(通常是时间和某个值)。因此,让我们创建一些测试数据来说明。
import pandas as pd
pattern = ("....1...."
"....1...."
"..11111.."
".1133311."
"111393111"
".1133311."
"..11111.."
"....1...."
"....1....")
# create the data and coords
Zdata = list(map(lambda d:0 if d == '.' else int(d), pattern))
Zinverse = list(map(lambda d:1 if d == '.' else -int(d), pattern))
Xdata = [x for y in range(1,10) for x in range(1,10)]
Ydata = [y for y in range(1,10) for x in range(1,10)]
# pivot the data into columns
data = [d for d in zip(Xdata,Ydata,Zdata,Zinverse)]
# create the data frame
df = pd.DataFrame(data, columns=['X','Y','Z',"Zi"], index=zip(Xdata,Ydata))
df.head(5)
编辑:这段数据是演示数据,通常来自需要更多清理和转换才能绘图的数据库查询。在这种情况下,数据已对齐,除了有一个我们不需要的列(Zi)之外,没有问题。
因此,pattern
中的数字被转换为 df
的 Z 列中的高度数据('Zi' 是反向图像),并且使用该数据帧,我努力想出了这个旋转方法,它由 3 个单独的操作组成。我想知道是否可以更好地实现。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
Xs = df.pivot(index='X', columns='Y', values='X').values
Ys = df.pivot(index='X', columns='Y', values='Y').values
Zs = df.pivot(index='X', columns='Y', values='Z').values
ax.plot_surface(Xs,Ys,Zs, cmap=cm.RdYlGn)
plt.show()
虽然我已经有一些东西在运作,但我感觉肯定有比我现在做的更好的方法。在一个大数据集上,我想做三个透视表可能是绘制图表的一种昂贵方式。是否有更有效的方法来转换这些数据呢?