使用一个常量分布在matplotlib中绘制3D图形

时间:2017-01-10 14:43:49

标签: python python-3.x matplotlib

我有很多模拟数据。我想在3D情节中代表它。可以说我有10分代表10秒。对于每一秒,我有一个包含〜数百万个能量值的列表(列表的长度每秒都是常数)。我想把它绘制成一个表面,其中第三维中的点的分布应该是恒定的(如1,2,3,4 ......)。

我阅读了关于曲面的教程,但是示例列表以我不理解的方式嵌套。

到目前为止我尝试了什么:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
print(X)
ax.plot_wireframe([1,2,3,4,2,4,6,8], [1,2,3,4,1,2,3,4], [1,1,1,1,2,2,2,2])
plt.show()

这里我假设在第一秒,能量是1,2,3,4,第二秒,它们是2,4,6,8。我试图手动添加第三轴的分布(因此两点为1,2,3,4,1,2,3,4)。

上面的代码没有输出。

这可以以某种方式完成吗?

1 个答案:

答案 0 :(得分:2)

很奇怪你根本没有输出,没有新的窗口打开?您是否可以在任何更简单的example中使用matplotlib

正如我在评论中所说,使用Python 2.7.2和matplotlib 1.4.3我得到: Given example output.

我更改了您的代码以尝试模拟您想要执行的操作,让我们看看它是否有用:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

N_Times = 10
N_energies = 50 # per time
Times = np.arange(N_Times) # array with all the times
Energies_indexes = np.arange(N_energies) # array with the energy indexes
X, Y = np.meshgrid(Times, Energies_indexes) # generates the base grid
Energies = np.asarray([Energies_indexes + t for t in Times])
# The above array should have one line of energies for each
# value of time. So Energies[0] would be the list of energies
# for the first time value, and Energies[0][0] the first energy
# for that time.
# This is simpler to understand, I think, but will mean we'll have
# to transpose it (.T) to make it compatible with meshgrid*.
# Adapt accordingly.
# * see: http://stackoverflow.com/questions/27495462/

print X.shape, Y.shape, Energies.shape
print "... and that's why we use the trasnpose (.T) when ploting"

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X, Y, Energies.T)
ax.set_xlabel('Time (?)')
ax.set_ylabel('Energies Index (#)')
ax.set_zlabel('Energy Value (?)')
plt.show()

导致: New example output. 正如预期的那样,能量随着指数和时间的增加而增加。