matpltlib 图片显示

今天通过一段代码来理解matpltlib的绘图功能,顺便复习一下小知识点

fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))
    in_imgs = mnist.test.images[10:20]
    noisy_imgs = in_imgs + noise_factor * np.random.randn(*in_imgs.shape)  # numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值 形状由参数指定
    noisy_imgs = np.clip(noisy_imgs, 0., 1.)

    reconstructed = sess.run(outputs_,
                             feed_dict={inputs_: noisy_imgs.reshape((10, 28, 28, 1))})

    for images, row in zip([noisy_imgs, reconstructed], axes):
        for img, ax in zip(images, row):
            ax.imshow(img.reshape((28, 28)))
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)

    fig.tight_layout(pad=0.1)

以下是对以上代码的详细讲解(一行一行的解释):

# 第一句代码:
fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))

# 在matlab中
#  subplot(m,n,p)或者subplot(mnp)
# subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果第一个数字是2就是表示2行图。p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。
# 在matplotlib下, 一个 Figure 对象可以包含多个子图(Axes), 可以使用 subplot() 快速绘制, 此例中,axes形如:[[0,1,2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17,18,19]]  20个元素
# subplot(numRows, numCols, plotNum)  numRows, numCols表示绘图区域被分成 numRows 行和 numCols 列
# 然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1
# plotNum 参数指定创建的 Axes 对象所在的区域
# 如果 numRows, numCols 和 plotNum 这三个数都小于 10 的话, 可以把它们缩写为一个整数, 例如 subplot(323) 和 subplot(3,2,3) 是相同的.

# 第二句代码:
    in_imgs = mnist.test.images[10:20]  #    取mnist数据集中的十张图片
# 第三句代码:
    noisy_imgs = in_imgs + noise_factor * np.random.randn(*in_imgs.shape) 
    # numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值,形状由参数指定 ,以上in_imgs.shape是一串tuple,*运算符可看做是解压
    # 所以这里 numpy.random.randn(图片1的shape, 图片2的shape, …, 图片10的shape)
    # noise_factor 控制噪声强度
# 第四句代码:
    noisy_imgs = np.clip(noisy_imgs, 0., 1.)
    # np.clip将加噪声后的noisy_imgs的像素值约定在0.0-1.0之间
# 第五句代码:
    reconstructed = mnist.test.images[:10]
    # 将噪声图片放入网络,得到重构出来的图片
# 第六句代码:
    for images, row in zip([noisy_imgs, reconstructed], axes):
    # zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    # 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
# 第七句代码
        for img, ax in zip(images, row):
            ax.imshow(img.reshape((28, 28)))
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)
            # plt.axis('off') #关闭xy坐标轴
            # frame.axes.get_yaxis().set_visible(False)  #不显示y轴        
            # frame.axes.get_xaxis().set_visible(False) #不显示x轴
# 第八句代码
    fig.tight_layout(pad=0.1)
    # 在 matplotlib 中,轴域(包括子图)的位置以标准化图形坐标指定。 可能发生的是,你的轴标签或标题(有时甚至是刻度标签)会超出图形区域,因此被截断
    # 为了避免它,轴域的位置需要调整。对于子图,这可以通过调整子图参数(移动轴域的一条边来给刻度标签腾地方)。Matplotlib v1.1 引入了一个新的命令tight_layout(),自动为你解决这个问题。
    # 当你拥有多个子图时,你会经常看到不同轴域的标签叠在一起
    # tight_layout()也会调整子图之间的间隔来减少堆叠
# 第九句
plt.show() # 一定要加这个图片才会都显示出来,仅仅在大图里面显示子子图示无法显示的。要再显示子子图之后调用一次大图(fig)的显示

啦啦啦,下面就是示意图了figsize调成(20,4)

显示效果

如果把figsize调成(20,1)
显示图片

开心,今天又总结了一个知识点

知识点的参考博客
Numpy 中clip函数的使用
python使用matplotlib:subplot绘制多个子图
Python zip() 函数
tight_layout
matplotlib subplot 子图

猜你喜欢

转载自blog.csdn.net/xiongchengluo1129/article/details/80237359
今日推荐