当前位置:   article > 正文

matplotlib文档:图像教程,面向对象的API 说明_matplotlib image api

matplotlib image api

图像教程

matplotlib 绘制图像,首先启动 IPython 这是对标准python的最出色的增强,并且与matplotlib紧密结合。启动后,需要与GUI 事件循环链接,这告诉ipython 在哪如何显示图表,再命令行中使用 %matplolib 魔法命令。

%matplotlib inline # 针对jupyter notebook 的
  • 1

这样会关闭内联的绘图,让图形出现在你的 notebook 中,这对交互式有重要的意义。对于内联绘图,出图单元后面的单元里的命令不会影响该图,就比如说你无法用之后的命令改变已创建图的颜色啥的。但是对于其他后端比如 QT5 ,打开的是一个分离的窗口来展示图,之后的命令也会作用,因为这个图再内存中是活动的对象。

这里建议使用命令式的绘图接口,pyplot。这个接口包含全局的状态,可以非常快速简单的进行各种绘图变量的实验,面向对象的接口更适合来做大型的应用开发。

将图片导入为numpy数组

matplotlib 依靠 Pillow 库来加载图形数据。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img = mpimg.imread('5.jpg')
print(img)
print(img.dtype)   # uint8
# matplotlib 可以处理 float32 and utint8 ,但是任何图形的读取都要限制再uint8 的格式。
# 这与人类的眼睛有关。。。
# 对于RGB RGBA 的图形支持float32 and utint8 对于灰度图就只支持 float32 了。
# 注意格式的转换
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

绘制数组为图形

implot = plt.imshow(img) 
  • 1

在这里插入图片描述

pseudocolor schemes

是叫伪色吗,可以用来增强对比,可视化你的数据更加容易。但只能处理一个通道的图像,灰度图,亮度图之类的,对于RGB 之类的就需要取出一个通道来:

'''
注意再 jupyter notebook 中,如果使用了 %matplotlib inline 是无法改变渲染后的图像
也就是说如果再之后的单元里改变是不会产生效果的,所以要放到一个单元里。
'''
img = mpimg.imread('5.jpg')
lum_img = img[:,:,0]
plt.subplot(121)
imgplot = plt.imshow(lum_img)
plt.subplot(122)
plt.imshow(lum_img,cmap='hot') # 对于亮度图,使用默认的颜色映射

imgplot.set_cmap('nipy_spectral')   # 独立的更改配色方案。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

色标参考

查看颜色代表的值:
在这里插入图片描述

检测一个指定的数据范围

增强图像的对比度,或卓达指定区域的对比度,同时牺牲一些颜色变换不大或不重要的细节,找到感兴趣区域的工具就是直方图。

plt.hist(lum_img.ravel(), bins=256, range=(0.0, 1.0))   # 这个图像是经过归一化的,像素范围0-1
imgplot = plt.imshow(lum_img, clim=(0.0, 0.7))  # or set_clim() 方法来限制输出的区域


fig = plt.figure()
ax = fig.add_subplot(1, 2, 1)
imgplot = plt.imshow(lum_img)
ax.set_title('Before')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
ax = fig.add_subplot(1, 2, 2)
imgplot = plt.imshow(lum_img)
imgplot.set_clim(0.0, 0.7)
ax.set_title('After')
plt.colorbar(ticks=[0.1, 0.3, 0.5, 0.7], orientation='horizontal')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

数组插值方案

再图像大小调整时,像素个数改变,就使用插值方法(更具不同的数学方法)来填充,

from PIL import Image
img = Image.open('2.png')
img.thumbnail((64, 64), Image.ANTIALIAS)  # resizes image in-place
imgplot = plt.imshow(img)   # 使用的 Bilinear 双线性插值方法,默认

imgplot = plt.imshow(img, interpolation="nearest")

imgplot = plt.imshow(img, interpolation="bicubic")    # 常用于放大
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

面向对象的API 说明

import numpy as np
import matplotlib.pyplot as plt


data = {'Barton LLC': 109438.50,             # 过程中使用的数据
        'Frami, Hills and Schmidt': 103569.59,
        'Fritsch, Russel and Anderson': 112214.71,
        'Jerde-Hilpert': 112591.43,
        'Keeling LLC': 100934.30,
        'Koepp Ltd': 103660.54,
        'Kulas Inc': 137351.96,
        'Trantow-Barrows': 123381.38,
        'White-Trantow': 135841.99,
        'Will LLC': 104437.60}
group_data = list(data.values())
group_names = list(data.keys())
group_mean = np.mean(group_data)

fig, ax = plt.subplots()          # 首先上生成 axes.Axes 和 figure.Figure 的实例

ax.barh(group_names, group_data)    # 绘制条形图

print(plt.style.available)         # 控制样式,查看可用的样式的列表
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

plt.style.use('classic')    # 激活样式

fig, ax = plt.subplots()
ax.barh(group_names, group_data)        # 重新绘制
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

在这里插入图片描述

自定义绘图

对图进行一些微调

fig, ax = plt.subplots(figsize=(8, 4))  # 使用plt.subplot 的参数改变绘图大小
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()    # 获得标签
plt.setp(labels, rotation=45, horizontalalignment='right')
# 使用setp方法来修改多个属性,旋转,水平对齐
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')       # 使用set() 方法为 Axes 对象设置属性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
也可以再一个 Axes 实例中绘制多个元素,只要简单的使用别的绘图方法就行。

fig, ax = plt.subplots(figsize=(8, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

ax.axvline(group_mean, ls='--', color='r')     # 加一条垂直线

for group in [3, 5, 8]:
    ax.text(145000, group, "New Company", fontsize=10,
            verticalalignment="center")

# Now we move our title up since it's getting a little cramped
ax.title.set(y=3)

ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')
ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])

fig.subplots_adjust(right=1)    # 调整子图布局。

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

保存子图

print(fig.canvas.get_supported_filetypes()) # 打印支持的格式
{'eps': 'Encapsulated Postscript', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'ps': 'Postscript', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}

fig.savefig()
- transparent=True, 如果格式支持背景为透明的
- dpi,分辨率
- bbox_inches =“ tight”使图形的边界适合我们的绘图。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
例子:堆积条形图
labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 35, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]
men_std = [2, 3, 4, 1, 2]
women_std = [3, 5, 2, 3, 3]
width = 0.35       # the width of the bars: can also be len(x) sequence

fig, ax = plt.subplots()
# yerr,误差线
ax.bar(labels, men_means, width, yerr=men_std, label='Men')
ax.bar(labels, women_means, width, yerr=women_std, bottom=men_means,  # 堆叠
       label='Women')

ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.legend()

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

例子:带标签的条形图分组
import matplotlib
import matplotlib.pyplot as plt
import numpy as np


labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='Men')    # 这样分组啊,,学到了
rects2 = ax.bar(x + width/2, women_means, width, label='Women')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()


def autolabel(rects):
    """Attach a text label above each bar in *rects*, displaying its height."""
    for rect in rects:
        height = rect.get_height()
        ax.annotate('{}'.format(height),
                    xy=(rect.get_x() + rect.get_width() / 2, height),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",
                    ha='center', va='bottom')


autolabel(rects1)
autolabel(rects2)

fig.tight_layout()

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/329865
推荐阅读
相关标签
  

闽ICP备14008679号