使用多个子图显示/保存多个数字(matplotlib / python)

时间:2018-04-18 12:31:23

标签: python matplotlib plot subplot

我正在处理大量图像(裁剪,通过网络运行等),然后存储在单元中。从单位我然后绘制一个图形与多个子图显示特定卷积层图像的激活。

我正在努力实现的是,给定一组多个图像,每个图像的数字,每个图像的数字,将被显示或保存到目录中(如果这样可以更容易在jupyter中处理)以及每个数字子图。

单个图像的单位变为单位:

[[0.0000000e+00 0.0000000e+00 0.0000000e+00 ... 3.3075356e-01
    0.0000000e+00 0.0000000e+00]
   [0.0000000e+00 1.4396116e-01 0.0000000e+00 ... 0.0000000e+00
    0.0000000e+00 0.0000000e+00]
   [0.0000000e+00 5.4249477e-01 1.9857159e-01 ... 0.0000000e+00
    1.5366032e+00 1.0890217e+00]
   ...
   [7.5161266e-01 9.6204914e-02 6.8889879e-02 ... 1.3110014e+00
    5.4128194e-01 4.9922270e-01]
   [7.5161266e-01 9.6204914e-02 6.8889879e-02 ... 1.3110014e+00
    5.4128194e-01 4.9922270e-01]
   [7.5161266e-01 9.6204914e-02 6.8889879e-02 ... 1.3110014e+00
    5.4128194e-01 4.9922270e-01]]

功能:

def getActivations(layer,stimuli):
    with tf.Session(graph=graph) as sess:
        #print (stimuli)
        #im=stimuli
        im=np.reshape(stimuli,[-1,224,224],order='F')#stimuli
        im=np.expand_dims(im,axis=0)

        #im=np.reshape(im,[-1,224,224],order='F')#stimuli
        #plt.imshow(im,interpolation="nearest", cmap="gray")
        #print (im)
        #for im in stimuli:
        #batch = np.array([im for i in range(1)])
        x = graph.get_tensor_by_name('prefix/data:0')
        #x2 = tf.reshape(x,[-1,224,224])
        y=graph.get_tensor_by_name(layer)
        units = sess.run(y,feed_dict={x: np.swapaxes(im,1,3)})#np.reshape(stimuli,[-1,224,224],order='F'),keep_prob:1.0})
        #print (units)
        plotNNFilter(units)



def plotNNFilter(units):
    #for a in units:

    #print ("###############################################################")
    #print (units)
    filters = units.shape[3]
    #print ("###############################################################")
    #print (filters)
    plt.figure(1,figsize=(20,20))
    n_columns = 6
    n_rows = math.ceil(filters / n_columns) + 1
    for i in range (filters):
        #plt.subplot(n_rows,n_columns, i+1)
        plt.subplot(n_rows,n_columns, i+1)
        plt.title('Filter' + str(i))
        plt.imshow(units[0,:,:,i],interpolation="nearest",cmap="gray")

我收到此折旧错误:

  

MatplotlibDeprecationWarning:使用相同的参数添加轴   因为之前的轴当前重用了早期的实例。在未来   版本,将始终创建并返回一个新实例。   同时,这个警告可以被压制,以及未来的行为   通过将唯一标签传递给每个轴实例来确保。   warnings.warn(message,mplDeprecation,stacklevel = 1)

我看到了另一个带有相同错误警告的问题:

Matplotlib: Adding an axes using the same arguments as a previous axes

Plotting on multiple figures with subplots in a single loop

但我认为答案不适用于我想要实现的目标? Due to having less than 10 reputation i can not attach an image. The image has 64 subplots, as many as the filters

打印len(单位)以便我可以使用该数字并将其作为迭代使用,以执行plt.figure(i,...)为每个单位打印1。

1 个答案:

答案 0 :(得分:0)

您可以先使用fig, axes = plt.subplots(numrows, numcols)创建子图。然后axes将是一个子图的数组,您可以迭代并绘制您喜欢的任何内容。

注意:行数和列数必须是整数

filters = units.shape[3]
n_columns = 6
n_rows = int(math.ceil(filters / n_columns) + 1)
fig, axes = plt.subplots(n_rows, n_columns, figsize=(20, 20))

for i, ax in enumerate(axes.flatten()):
    if i>=filters:
        ax.remove()
    else:
        ax.set_title('Filter' + str(i))
        ax.imshow(units[0, :, :, i], interpolation="nearest", cmap="gray")

axes是一个子图的数组,所以为了遍历它们,我们需要展平这个数组。然后我们遍历它们,为每个子图分配axi本质上是一个计数器。因为并非所有子图都被使用(后两个将是空的)我检查i是否大于或等于图像数if i>=filters:,如果是,我删除这些子图。如果不是真的,我们继续绘制图像。