Matplotlib绘图数据可视化必备有这一篇就够了

本章节会带着大家了解一下 Matplotlib 中的一个库 pylot,这个库是一个仿 MATLAB 命令风格的绘制各类可视化图形的命令子库。在这个库的帮助下,我们将可以通过一个个命令完成图像的绘制。

文章目录

  • 前言
  • 一、pyplot
    • 1. 导入相应包
    • 2. figure()
    • 3.show()/imshow()
    • 4.plot() 入门
    • 5. imread()
    • 6.savefig()
    • 7.subplot()/subplots()
  • 二、plot() 类函数进阶教程
    • 1.绘制颜色
    • 2.风格字符
    • 3.标记字符
    • 4.复合控制字符
  • 三、刻度,标签,图例
    • 1.刻度范围
    • 2.刻度划分
    • 3.显示刻度标签
    • 4.坐标轴标签和标题
    • 5.图例
  • 四、绘图函数
    • 1.饼状图
    • 2.直方图
    • 3.柱状图
    • 4.水平柱状图
    • 5.堆叠柱状图
    • 6.散点图


前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、pyplot

1. 导入相应包

当我们希望实际使用 pyplot 时会面对一个问题:这个库的名字太长,重复调用的时候工作量太大。因此一般来说我们会用一个更加方便的方法进行导入:

import matplotlib.pyplot as plt

其中 plt 就是我们对 pyplot 默认的缩写,一般我们见到诸如 plt.XXX 这种格式的函数就是在调用 pyplot 里面的函数。

2. figure()

在建立一个图像的时候,我们首先需要打开一个输出窗口,plt.figure() 就是用来打开输出窗口的命令。一个标准的 plt.figure() 函数格式如下所示:

plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
  • 其中,num 用来指定图像编号或者名称。如 num=‘my_figure’ 就是将图像的名称设为 my_figure。
  • figsize 的作用是指定图像的宽和高,单位为英寸。如 figsize=(6, 8) 就是指定图像的大小为宽6英寸,长8英寸。
  • dpi 的作用是指定绘图对象的分辨率,dpi 越高分辨率越高,默认 dpi 为80。如 dpi=100 就是将图像的 dpi
    设置为100.
  • facecolor 用来指定背景颜色。如 facecolor=black 就是将背景颜色设为黑色。
  • edgecolor用来指定边框颜色。如 edgecolor=black
  • frameon 则表示是否显示边框。frameon 为 True 则显示,为 False 则不显示。

更加详细的 API 描述可以查阅官方文档 :matplotlib.pyplot.figure

3.show()/imshow()

在使用 figure() 建立图像后通常都需要调用函数 show(),这是因为我们调用 figure() 建立的图像是储存在内存中的,如果不调用 show() 函数将可能导致图像无法正确的被显示出来(有些 IDE 例如 Jupyter notebook 可以在没有 show() 的情况下显示图像)。因此 show() 的作用就是将我们生成好的图像显示出来。

imshow() 的作用和 imshow() 非常的接近,都可以用来显示图像。两者的区别在于 imshow 不仅可以显示图像,还可以显示其格式;show() 则仅会显示图像。标准的 imshow() 和 show() 的格式如下:

#下方两种方法只需要使用其中一种即可
plt.imshow()
plt.show()

4.plot() 入门

figure() 函数所创建的仅仅是一个图像输出框,并没有真实的图像内容。现在我们来学习一个最基本的画图函数 plot()。

plot() 函数可以用来在 2D 平面上绘制点和线,并控制输出时的样式。标准的 plot() 函数格式如下:

plt.plot(x, y, scalex=True, scaley=True, data=None)

其中,x 和 y 分别是数据的横坐标和纵坐标。x 和 y 可以传入多种数据结构,包括元组,列表,np.array 和 pd.Series。

5. imread()

除了自行绘制图像,有时候我们还会需要从外部读取图像。此时我们就需要通过函数 imread() 来完成图像的读取。标准的 imread() 函数格式如下所示:

plt.imread(fname, format=None)

其中,fname 的作用是设定要读取的图像文件的路径和名称。例如 fname = ‘D:\local\test_img.png’ 意味着我们将读取路径 D:\local\ 下格式为 png 的图像文件 test_img。

format 的作用是设定读取数据的图像文件格式。如果为 None,则将从文件名中获取。如上例中,test_img.png 意味着图片是以 png 格式储存的。

需要注意的是,如果想要在后续的流程中使用读取的图像,imread() 读取出来的数据需要被储存在某个变量中。imread() 读取出来的图像数据将被储存为 numpy.array 格式。

6.savefig()

在前两个例子中我们绘制了一条直线并读取了一张图像。如果我们希望保留某张图像我们应该怎么做呢?这里我们就需要使用 savefig() 函数来保存图像。标准的 savefig() 函数格式如下所示:

plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w')

其中,fname 的作用是指定保存的文件名。例如当 fname 的值为 ‘my_img’ 时保存好的图像文件的名称就是 ‘my_img’。

dpi 的作用是指定输出文件的分辨率,默认和原图像保持一致。

facecolor 和 edgecolor 的作用和 figure() 函数一致。

运行 savefig() 函数后图像将被保存在当前程序的运行目录下。

# coding: utf-8
import matplotlib.pyplot as plt


def load_and_save_image(input_dir: str, output_dir: str):
    """
    :param input_dir: The direction of input image, like: '../input/img.png'
    :param output_dir: The direction of output image, like: '../output/img.png
    """
    # write your code here
    img = plt.imread(input_dir)
    plt.imshow(img)
    plt.savefig(output_dir)

7.subplot()/subplots()

我们已经学会了基本的图像读取、绘制、显示及保存,那么如果我想同时显示多张图片呢?一个办法就是每次输出一张图片都用 figure() 函数打开一个新的图像窗口;另一个办法是使用 subplot() 和 subplots() 函数一次在一个图像窗口中显示多张图片。标准的 subplots() 和 subplot 函数的格式如下所示:

plt.subplot(nrows=1, ncols=1, index=1, **fig_kw)
plt.subplots(nrows=1, ncols=1, **fig_kw)

其中,nrows 的作用是设定图像的总行数。

ncols 的作用是设定图像的总列数。

index 的作用是索引到某个具体的图像。这里需要注意我们的图像按照 从左往右,从上往下 的顺序从 1 开始排列。

subplot() 和 subplots() 会返回两个组件:绘图区域 fig,以及坐标轴等组件 ax。通常来说我们可以不用分开读取这两个部分,不过当有需要对其中的一部分进行设置的时候我们可以通过如下方式进行读取:

[in]: fig, ax = subplot(1,1)
[in]: figs, axes = subplots(2,3)

一般对某一个图像我们会用 fig 和 ax 这样的变量储存,多个图像我们会用 figs 和 axes 来储存。

二、plot() 类函数进阶教程

1.绘制颜色

Matplotlib绘图数据可视化必备有这一篇就够了_第1张图片

import numpy as np
x_label = np.arange(10)
plt.plot(x_label, x_label*1., 'g', 
         x_label, x_label*2., 'b',
         x_label, x_label*3.,'y')
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第2张图片

2.风格字符

Matplotlib绘图数据可视化必备有这一篇就够了_第3张图片

import numpy as np
import matplotlib.pyplot as plt
x_label = np.arange(10)
plt.plot(x_label, x_label*1., '-', 
         x_label, x_label*2., '--',
         x_label, x_label*3.,'-.')
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第4张图片

3.标记字符

Matplotlib绘图数据可视化必备有这一篇就够了_第5张图片

import numpy as np
import matplotlib.pyplot as plt
x_label = np.arange(10)
plt.plot(x_label, x_label*1., '*', 
         x_label, x_label*2., '.',
         x_label, x_label*3.,'o')
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第6张图片

4.复合控制字符

在下面的例子中,我们将绘制绿色的点划线,数据点用瘦菱形标记:

plt.plot(x_label, x_label*1., 'gd-.')
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第7张图片

三、刻度,标签,图例

1.刻度范围

通常来说 matplotlib 会自动根据数据范围设定刻度范围,不过有时候我们需要将数据放入某些特定的范围中进行显示。这时候我们就需要通过 plt.xlim() 和 plt.ylim() 对坐标轴的刻度范围进行限制。

import matplotlib.pyplot as plt
import numpy as np

x_label = np.arrang(10)
fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*2)
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第8张图片
上面的图像将作为本节中的原始图像。

如果我们需要将数据放在更大的范围内显示,我们可以通过如下方式进行调整:

fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*2)
# 将 X 轴放大到 [0, 20] 的范围之间
ax.set_xlim([0, 20])

# 第二种方法
# plt.xlim([0,20])
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第9张图片
可以看到这里 X 轴的范围已经被放大到了 [0, 20] 之间。注意当我们在 ax 里面进行操作的时候使用的命令是 set_xlim 和 set_ylim。

2.刻度划分

有时候我们会需要自定义刻度的划分,这时候我们就可以通过 plt.xticks() 和 plt.yticks()或者 ax.set_xticks() 和 ax.set_yticks() 来对坐标轴上的刻度进行编辑。
如果我们希望原始图像的 X 轴的刻度范围是 [0, 6],步幅为2,则我们可以通过如下代码实现:

fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*2)
ax.set_xticks(range(0, 7, 2))
# 第二种方法
# ax.set_xticks([0,2,4,6])
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第10张图片
这里我们需要注意三点:

  • 首先刻度不一定可以铺满整个坐标轴,如果无法铺满则剩下的部分不会显示刻度;
  • 第二,range() 函数无法生成浮点数,因此如果刻度需要出现小数最好使用第二种方法输入刻度;
  • 最后,设置刻度时无法显示最后一个刻度,因此如果需要显示最后一个刻度最好多生成一个刻度。

3.显示刻度标签

在有些情况下我们的刻度单位并不是数字,而是某些文字信息。此时我们可以通过 ax.set_xticklabels() 和 ax.set_yticklabels() 设置每个刻度对应的标签。

例如我们希望对原始图像的 Y 轴进行编辑,从0开始每提高两个单位划分一个刻度,共计4个,这四个刻度的标签分别为 ‘Forth’, ‘Third’, ‘Second’, 和 ‘First’。则我们可以通过如下代码进行设置:

fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*2)

# 设置 y 轴刻度名称
ax.set_yticks(range(0,8,2))
ax.set_yticklabels(['Forth', 'Third', 'Second', 'First'])

plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第11张图片

4.坐标轴标签和标题

没有坐标轴标签的话很多时候我们会不知道每个坐标轴究竟代表了什么。这里我们可以通过 ax.set_xlabel() 和 ax.set_ylabel() 或者 plt.xlabel() 和 plt.ylabel() 来实现。

有时候我们需要写出来这张图像的标题是什么,我们可以通过 ax.set_title() 或者 plt.title() 来设置标题。

5.图例

  • ax.legend()
  • plt.legend()
fig, ax = plt.subplots(1)
ax.plot(x_label, x_label*1., label='Sam')
ax.plot(x_label, x_label*2., label='Lisa')
ax.plot(x_label, x_label*3., label='Alen')
plt.xlabel('Distance')
plt.ylabel('Time')
plt.title('Sample Plot')
ax.legend()
plt.show()

Matplotlib绘图数据可视化必备有这一篇就够了_第12张图片

四、绘图函数

1.饼状图

  • plt.pie() 函数
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)

这里我们介绍几个最常用的参数:

  • x: 输入数据

  • explode: 某个 label 的突出程度

  • labels: 每一类数据的标签

  • colors: 每一类数据的颜色

labels = ['cat','dog','bird','fish']
sizes = [10,30,50,10]
colors = ['red','yellow','lightskyblue','green']
explode = (0,0,0.1,0)

plt.pie(sizes, explode=explode, labels=labels, colors=colors)

Matplotlib绘图数据可视化必备有这一篇就够了_第13张图片

2.直方图

  • plt.hist() 函数
hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

这里我们介绍几个最常用的参数:

  • x: 输入数据

  • bins: 直方图的长条形数量

  • histtype: 直方图类型,包括 ‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’

mu,sigma = 150,40
data = np.random.normal(mu,sigma,size=100).1,0)

plt.hist(data, bins=20)

Matplotlib绘图数据可视化必备有这一篇就够了_第14张图片

3.柱状图

  • bar() 函数
bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

这里我们介绍几个最常用的参数:

  • x: 数据点的横坐标

  • height: 柱的高度

  • width: 柱的宽度

  • label: 额外参数,用来指定每种数据的标签,后续可以生成图例

  • color: 额外参数,用来指定柱的颜色

# coding: utf-8
import matplotlib.pyplot as plt

from numpy import ndarray


def bar_plot(x_1: ndarray, num_1: ndarray, x_2: ndarray, num_2: ndarray):
	plt.bar(x_1,height=num_1,width=0.4,color='red',label='height')
    plt.bar(x_2,height=num_2,width=0.4,color='blue',label='weight')
    plt.legend()

Matplotlib绘图数据可视化必备有这一篇就够了_第15张图片

4.水平柱状图

  • plt.barh() 函数
barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
# 生成第一组数据
num_list1=[20,30,15,35]
y_1 = [1., 2., 3., 4.]
# 生成第二组数据,注意这里的值设置为 y+height 为宜
num_list2=[15,30,40,20] 
y_2 = [1.4, 2.4, 3.4, 4.4]

rects1 = plt.barh(y_1,height=0.4,width=num_list1,color='red',label='height')
rects2 = plt.barh(y_2,height=0.4,width=num_list2,color='blue',label='weight')
plt.legend()

Matplotlib绘图数据可视化必备有这一篇就够了_第16张图片

5.堆叠柱状图

  • plt.bar() 函数
  • 不同的是我们可以通过 bottom 参数指定某一个类别的柱的基底,从而实现柱的堆叠。
# 生成两组数据
num_list1=[20,30,15,35]
num_list2=[15,30,40,20] 
# 两组数据共用同一组 label
x = [1., 2., 3., 4.]
# 设定横坐标刻度显示 label
label = ['first','second','third','forth']
rects1 = plt.bar(x,height=num_list1,width=0.6,color='red',label='height')
rects2 = plt.bar(x,height=num_list2,width=0.6,color='blue',label='weight',bottom=num_list1)
plt.xticks(x, label)
plt.xlabel('grade')
plt.ylabel('count')
plt.legend()

Matplotlib绘图数据可视化必备有这一篇就够了_第17张图片

6.散点图

  • plt.scatter() 函数
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)

这里我们介绍几个最常用的参数:

  • x: 数据点的横坐标

  • y: 数据点的纵坐标

  • s: 数据点的大小

  • c: 数据点的颜色

  • marker: 数据点的样式

# coding: utf-8
import matplotlib.pyplot as plt

from numpy import ndarray


def scatter_plot(x_1: ndarray, y_1: ndarray, x_2: ndarray, y_2: ndarray):

    # write your code here
    plt.scatter(x_1, y_1, c='red', marker='o')
    plt.scatter(x_2, y_2, c='blue', marker='*')

Matplotlib绘图数据可视化必备有这一篇就够了_第18张图片

你可能感兴趣的:(Echarts可视化技术专栏,matlab,图像处理,绘制图形,可视化)