使用PolyCollection 3D Graph

时间:2017-11-29 06:46:18

标签: python matplotlib plot charts 3d

我试图使用matplotlib绘制运行我的神经网络的结果,其中包含不同数量的节点和隐藏层,我发现最好的方法是复制{{3} },所以我可以表明:

  • 不同神经元数量(y轴)的准确度(z轴)
  • 隐藏层数(x轴)如何影响这些趋势

从我之前链接的演示中,我尝试修改代码以适应我想要完成的任务,不幸的是,我得到this type of graph我个人发现matplotlib的文档非常缺乏,并且教程没有任何关于它是如何工作的描述,这使得像我这样从未用它做过3D绘图的人很难。

以下是我的代码中与构建3D绘图有关的部分:

verts = []
for i in range(len(z_axis_values)):
    ys = [0] + y_axis_values + [0]
    verts.append(list(zip(x_axis_values, ys)))

# Create a 3D plot
fig: Axes3D = plt.figure().add_subplot(111, projection='3d')
poly = PolyCollection(verts=verts, facecolors=[cc(color_options[i]) for i in range(len(x_axis_values))])
poly.set_alpha(0.7)

# Build the image
fig.add_collection3d(poly, zs=z_axis_values, zdir='y')
fig.set_xlabel(x_label)
fig.set_xlim3d(min(x_axis_values), max(x_axis_values))
fig.set_ylabel(z_label)
fig.set_ylim3d(min(y_axis_values), max(y_axis_values))
fig.set_zlabel("Accuracy")
fig.set_zlim3d(min(z_axis_values), 100)
fig.set_label("Accuracy over {} and {} in {}".format(x_label, z_label, data_set))
plt.savefig("plot_{}_{}_{}.png".format(data_set, x_label.replace(' ', ''), z_label.replace(' ', '')),
            bbox_inches='tight')
plt.show()

如果它有助于理解为什么它不起作用,我将详细说明我在测试它的示例中使用的数据:

>>> x_axis_values     # Number of neurons
[2, 10, 20, 50, 100]
>>> y_axis_values     # Number of hidden layers
[2, 3, 5]
>>> z_axis_values     # Accuracies of all the runs of the neural net, testing each possible number of hidden layers on each possible number of neurons
[94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 57.89473684210527, 92.10526315789474, 92.10526315789474, 57.89473684210527, 94.73684210526315, 94.73684210526315, 94.73684210526315]

如果我错过任何可能有助于解决此问题的信息,请告知我们。

1 个答案:

答案 0 :(得分:0)

您的代码中有一些奇怪的东西。我开始回复您在问题中链接的from the example code

如果我理解你的代码,你有3层,每层包含5个神经元。并且您有15个准确度值,因此我假设它们被组织为[5 x层1,5 x层2,5 x层3]。如果这是正确的,我会重塑你的z值以获得dims(3,5),这样就可以更容易地迭代它们。

z_axis_values = np.array(z_axis_values).reshape((len(y_axis_values),len(x_axis_values)))

然后您需要创建多边形顶点。这可以很容易地完成:

verts = []
for z in z_axis_values:
    verts.append(list(zip(x_axis_values, z)))

它为我们提供了具有以下形状的多边形(我用红点突出了角落的坐标),这不是你想要的。

enter image description here

你想要的是一个下降到0(或任意值bottom_val)的多边形。所以我们必须修改代码以添加到点,一个在左边缘,另一个在多边形的右边缘:

verts = []
for z in z_axis_values:
    verts.append(list(zip(
        [x_axis_values[0]]+x_axis_values+[x_axis_values[-1]], 
        [bottom_val]+z.tolist()+[bottom_val])))

enter image description here

获得正确的多边形后,您只需应用示例中的其余代码。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib.collections import PolyCollection
import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
import numpy as np

x_axis_values = [2, 10, 20, 50, 100]
y_axis_values = [2, 3, 5]
z_axis_values = [94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 94.73684210526315, 92.10526315789474, 94.73684210526315, 94.73684210526315, 57.89473684210527, 92.10526315789474, 92.10526315789474, 57.89473684210527, 94.73684210526315, 94.73684210526315, 94.73684210526315]
z_axis_values = np.array(z_axis_values).reshape((len(y_axis_values),len(x_axis_values)))

#bottom_val = min(z_axis_values.flatten())
bottom_val = 50

fig = plt.figure()
ax = fig.gca(projection='3d')

def cc(arg):
    return mcolors.to_rgba(arg, alpha=0.6)

verts = []
for z in z_axis_values:
    verts.append(list(zip([x_axis_values[0]]+x_axis_values+[x_axis_values[-1]], [bottom_val]+z.tolist()+[bottom_val])))


poly = PolyCollection(verts, facecolors=[cc('r'), cc('g'), cc('b')])
poly.set_alpha(0.7)
ax.add_collection3d(poly, zs=y_axis_values, zdir='y')

ax.set_xlabel('Neurons')
ax.set_xlim3d(min(x_axis_values), max(x_axis_values))

ax.set_ylabel('Hidden Layers')
ax.set_ylim3d(min(y_axis_values), max(y_axis_values))

ax.set_zlabel('Accuracy')
ax.set_zlim3d(bottom_val, 100)

plt.show()

enter image description here

希望有所帮助。