我有一个包含四列测量数据的pandas数据帧。我想创建一个3D表面图,其中行索引为X,列索引为Y,数据为Z.(每列中的数据是一系列离散测量结果,从测试中逐步输出每个类别Y的所有X值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 4), columns=['A', 'B', 'C', 'D'])
print(df)
A B C D
0 0.791692 -0.945571 0.183304 2.039369
1 -0.474666 1.117902 -0.483240 0.137620
2 1.448765 0.228217 0.294523 0.728543
3 -0.196164 0.898117 -1.770550 1.259608
4 0.646730 -0.366295 -0.893671 -0.745815
我尝试使用np.meshgrid将df转换为numpy网格,如下所示,但不确定我是否真正了解所需内容,或者是否可以这样使用df索引。
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = df.columns
y = df.index
X,Y = np.meshgrid(x,y)
Z = df
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
我已经在这里阅读了matplotlib 3D教程和相关答案,但仍然被卡住了。如果有人能指出我正确的方向,我将非常感激。
答案 0 :(得分:2)
你追求的一般策略很好。您唯一的错误是您从字符串列表创建meshgrid。当然maplotlib不能绘制字符串。
您可以创建一个与数据框中列数相同长度的数组,并将其插入meshgrid
。
x = np.arange(len(df.columns))
答案 1 :(得分:2)
只取列名称([' A',' B',' C',' D'])及其应该工作。
您可以稍后更改[' A',' B',' C',' D']的轴的刻度线
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(5, 4))
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = df.columns
y = df.index
X,Y = np.meshgrid(x,y)
Z = df
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)