首页 > 技术文章 > Python第三方库matplotlib(2D绘图库)入门与进阶

Black-rainbow 2018-09-03 13:24 原文

一、简介:

Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。 Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包

Matplotlib试图让简单的事情变得更简单,让无法实现的事情变得可能实现。 只需几行代码即可生成绘图,直方图,功率谱,条形图,错误图,散点图等。 有关示例,请参阅示例图和缩略图库。

为了简单绘图,pyplot模块提供了类似于MATLAB的界面,特别是与IPython结合使用时。 对于高级用户,您可以通过面向对象的界面或MATLAB用户熟悉的一组函数完全控制线条样式,字体属性,轴属性等。

二、相关文档:

官网教程文档:https://matplotlib.org/users/index.html
各个平台的安装教程:https://matplotlib.org/users/installing.html

三、入门与进阶案例

安装matplotlib数据图形化工具:

pip install matplotlib

1、绘制直线

  先通过numpy生成在直线 y = 5 * x + 5 上的一组数据,然后将其绘制在图表上

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10, 10)
y = 5 * x + 5
plt.plot(x, y)
plt.show()

  运行上面的代码,结果如下:

2、绘制折线图

  绘制折线图调用的matplotlib的方法一样,只是使用numpy生成的数据不一样。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1,10,10)
y = np.random.normal(1,5,10)
plt.figure()
plt.plot(x,y)
plt.show()

  由于涉及到随机数,每次运行的结果会不一样。某次运行结果如下:

3、同时绘制多条样式不一的曲线

  plot方法可以同时绘制多条图线,并支持不同的曲线采用不同的样式和颜色来显示。在下面的代码中,plot方法的参数,3个为一组,共3组,每一组的参数分别为 x轴坐标、y轴坐标和样式。

  样式用法:

格式:

fmt = '[color][marker][line]'

样式的第一个字母表示颜色,支持的颜色有:r(red)、g(green)、b(blue)、c(cyan)、m(megenta)、y(yellow)、w(white)、k(black)。

样式的第二部分表示图线的填充符号,可以写:--(虚线)、+(加号)、^(向上的正三角形)、s(正方形)、o(圆形)等。还可以同时采用两种填充方式,如‘ro--’表示用红色的虚线及实心圆来同时进行填充。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 100)
plt.plot(x, 100 * x, 'r--', x, 10 * x ** 2, 'g^', x, x ** 3, 'c+')
plt.show()

运行结果如下:

4、绘制散点图

  调用 scatter 方法可以绘制散点图。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1, 10, 10)
y = np.linspace(1, 10, 10)
plt.scatter(x, y)
plt.ylabel('y value')
plt.xlabel('x scale')
plt.title('Scatter Figure')
plt.show()

运行结果如下:

可以通过设置不同参数的形式获得不同的散点图:

import numpy as np
import matplotlib.pyplot as plt

# 固定随机数的seed,使其每次运行产生的结果都一样
np.random.seed(1)
num = 100
edgeRadius = 0.5
x = np.random.rand(num)
y = np.random.rand(num)
area = (200 * np.random.rand(num))
color = np.sqrt(area)
# 创建区域,用不同的样式来显示不同分区的点
triangleArea = np.ma.masked_where(x <= edgeRadius, area)
diamondArea = np.ma.masked_where(x > edgeRadius, area)
plt.scatter(x, y, s=triangleArea, marker='o', c=color)
plt.scatter(x, y, s=diamondArea, marker='d', c=color)
plt.title('Random Scatter')
plt.show()

  运行结果如下:

5、绘制柱状图与多个图形

  在以下示例中, figure函数指定了图表的编号和大小比例,suptitle设置标题,subplot指定当前绘图的位置(参数221表示2x2共四个图形区域,最后的1表示第一个图形区域)。后面的bar、scatter、plot和pie函数分别绘制了柱状图、散点图、折(直)线图和饼图。

import matplotlib.pyplot as plt

labels = ['A', 'B', 'C']
values = [1, 2, 3]

plt.figure(1, figsize=(9, 6))
plt.suptitle('Multiple Plots')

plt.subplot(221)
plt.bar(labels, values)
plt.subplot(222)
plt.scatter(labels, values)
plt.subplot(223)
plt.plot(labels, values)
plt.subplot(224)
plt.pie(values, labels=labels)
plt.show()

  运行结果如下:

1- 简单图形绘制

根据坐标点绘制:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([3, 5, 7, 6, 2, 6, 10, 15])
plt.plot(x, y, 'r')  # 折线 1 x 2 y 3 color
plt.plot(x, y, 'g', lw=10)  # 4 line w
# 折线 饼状 柱状
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([13, 25, 17, 36, 21, 16, 10, 15])
plt.bar(x, y, 0.2, alpha=1, color='b')  # 5 color 4 透明度 3 0.0
plt.show()

传入参数是numpy数组时的效果:

import numpy as np
import matplotlib.pyplot as plt

for i in range(0, 15):
    # 1 柱状图
    dateOne = np.zeros([2])
    dateOne[0] = i
    dateOne[1] = i
    y = np.zeros([2])
    y[0] = 10
    y[1] = 20
    plt.plot(dateOne, y, 'r', lw=8)
plt.show()

根据函数图像绘制:

"""简单图形绘制"""
import numpy as np
import matplotlib.pyplot as plt

# 从-1-----1之间等间隔采66个数,也就是说所画出来的图形是66个点连接得来的
# 注意:如果点数过小的话会导致画出来的二次函数图像不平滑
x = np.linspace(-1, 1, 66)
# 绘制y=2x+1函数的图像
y = 2 * x + 1
plt.plot(x, y)
plt.show()
# 绘制x^2函数的图像
y = x ** 2
plt.plot(x, y)
plt.show()

2- figure的简单使用

"""figure的使用"""
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 50)
# figure 1
y1 = 2 * x + 1
plt.figure()
plt.plot(x, y1)
# figure 2
y2 = x ** 2
plt.figure()
plt.plot(x, y2)
# figure 3,指定figure的编号并指定figure的大小,指定线的颜色,宽度和类型
# 一个坐标轴上画了两个图形
y2 = x ** 2
plt.figure(num=5, figsize=(4, 4))
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
plt.show()

一共会画出三张图,前两张和上面的简单案例画出来的两张一样。第三张:

3- 设置坐标轴

"""设置坐标轴"""
import numpy as np
import matplotlib.pyplot as plt

# 绘制普通图像
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')
# 设置坐标轴的取值范围
plt.xlim((-1, 1))
plt.ylim((0, 3))
# 设置坐标轴的lable
# 标签里面必须添加字体变量:fontproperties='SimHei',fontsize=14。不然可能会乱码
plt.xlabel(u'这是x轴', fontproperties='SimHei', fontsize=14)
plt.ylabel(u'这是y轴', fontproperties='SimHei', fontsize=14)
# 设置x坐标轴刻度,之前为0.25,修改后为0.5
# 也就是在坐标轴上取5个点,x轴的范围为-1到1所以取5个点之后刻度就变为0.5了
plt.xticks(np.linspace(-1, 1, 5))
plt.show()

上面代码的基础上加上下面代码(直接加在最后一句代码前面即可):

# 获取当前的坐标轴,gca = get current axis
ax = plt.gca()
# 设置右边框和上边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 设置x坐标轴为下边框
ax.xaxis.set_ticks_position('bottom')
# 设置y坐标轴为左边框
ax.yaxis.set_ticks_position('left')
# 设置x轴,y轴在(0,0)的位置
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))


如果在上面代码的最后一句之前加上下面的代码:

# 设置坐标轴label的大小,背景色等信息
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(12)
    label.set_bbox(dict(facecolor='green', edgecolor='None', alpha=0.7))

4- 设置legend图例

"""设置坐标轴"""
import numpy as np
import matplotlib.pyplot as plt

# 绘制普通图像
x = np.linspace(-1, 1, 50)
y1 = 2 * x + 1
y2 = x**2

plt.figure()
plt.plot(x, y1)
plt.plot(x, y2, color = 'red', linewidth = 1.0, linestyle = '--')

# 设置坐标轴的取值范围
plt.xlim((-1, 1))
plt.ylim((0, 3))

# 设置坐标轴的lable
#标签里面必须添加字体变量:fontproperties='SimHei',fontsize=14。不然可能会乱码
plt.xlabel(u'这是x轴',fontproperties='SimHei',fontsize=14)
plt.ylabel(u'这是y轴',fontproperties='SimHei',fontsize=14)

# 设置x坐标轴刻度, 之前为0.25, 修改后为0.5
#也就是在坐标轴上取5个点,x轴的范围为-1到1所以取5个点之后刻度就变为0.5了
plt.xticks(np.linspace(-1, 1, 5))
# 获取当前的坐标轴, gca = get current axis
ax = plt.gca()
# 设置右边框和上边框
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 设置x坐标轴为下边框
ax.xaxis.set_ticks_position('bottom')
# 设置y坐标轴为左边框
ax.yaxis.set_ticks_position('left')
# 设置x轴, y周在(0, 0)的位置
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data', 0))

plt.show()

5- 添加注解和绘制点以及在图形上绘制线或点

import numpy as np
import matplotlib.pyplot as plt

# 绘制普通图像
x = np.linspace(-3, 3, 50)
y = 2 * x + 1

plt.figure()
plt.plot(x, y)

# 将上、右边框去掉
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

# 设置x轴的位置及数据在坐标轴上的位置
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 设置y轴的位置及数据在坐标轴上的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))

# 定义(x0,y0)点
x0 = 1
y0 = 2 * x0 + 1

# 绘制(x0,y0)点
plt.scatter(x0, y0, s=50, color='blue')
# 绘制虚线
plt.plot([x0, x0], [y0, 0], 'k--', lw=2.5)
# 绘制注解一
plt.annotate(r'$2 * x + 1 = %s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30), textcoords='offset points',
             fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad = .2'))

# 绘制注解二
plt.text(-3, 3, r'$Test\ text. \mu \sigma_i, \alpha_i$', fontdict={'size': 16, 'color': 'red'})
plt.show()

6- 绘制散点图

 

 

 

 

 

 

 

https://blog.csdn.net/qq_34337272/article/details/79555544

未完待续

 

推荐阅读