Python 如何将pandas与matplotlib一起使用以创建三维打印

Python 如何将pandas与matplotlib一起使用以创建三维打印,python,pandas,matplotlib,Python,Pandas,Matplotlib,在matplot库上进行3D数据渲染所需的pandas转换方面,我有些困难。我拥有的数据通常是数字列(通常是时间和一些值)。因此,让我们创建一些测试数据来进行说明 import pandas as pd pattern = ("....1...." "....1...." "..11111.." ".1133311." &quo

在matplot库上进行3D数据渲染所需的pandas转换方面,我有些困难。我拥有的数据通常是数字列(通常是时间和一些值)。因此,让我们创建一些测试数据来进行说明

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)之外,没有任何问题

因此,
模式
中的数字被转换为
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()


虽然我有一些工作,但我觉得一定有比我现在做的更好的方法。在一个大数据集上,我可以想象做3个枢轴是一种昂贵的绘图方式。有没有更有效的方法来转换此数据?

我想您可以通过不使用pandas(而仅使用numpy数组)和使用numpy提供的一些便利功能(如和)来避免数据准备过程中的一些步骤

为此,我重写了您的代码,试图保持相同的逻辑和相同的变量名:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

pattern = ("....1...."
           "....1...."
           "..11111.."
           ".1133311."
           "111393111"
           ".1133311."
           "..11111.."
           "....1...."
           "....1....")


# Extract the value according to your logic
Zdata = list(map(lambda d:0 if d == '.' else int(d), pattern))

# Assuming the pattern is always a square
size = int(len(Zdata) ** 0.5)

# Create a mesh grid for plotting the surface
Xdata = np.linspace(1, size, size)
Ydata = np.linspace(1, size, size)
Xs, Ys = np.meshgrid(Xdata, Ydata)

# Convert the Zdata to a numpy array with the appropriate shape
Zs = np.array(Zdata).reshape((size, size))

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Plot the surface
ax.plot_surface(Xs, Ys, Zs, cmap=cm.RdYlGn)
plt.show()

谢谢@mgc我希望使用pandas,因为它能够在绘图之前执行许多其他功能来清理和转换数据。真正的数据将是多维中数百万行的数据列。因此,据我所知,在熊猫数据框中进行分组或重新采样数据的操作更容易,但我还不太清楚熊猫如何才能高效地得出绘图结果。我的错,发布后,我确实有一个印象,那就是我正在修改你的最小示例的设置,而不是真正回答它。我对@mgc的努力表示感谢。我有意避免使用meshgrid和linspace来创建示例,因为它们是难以捉摸的函数,并且选择了不需要查找的标准python方法。很容易把一个可能有很好答案的读者和太多难以捉摸的方法混淆起来。