python 绘图库 Matplotlib

版权声明:不经过同意,禁止转载。 https://blog.csdn.net/qq_34218078/article/details/82921913

matplotlib官方文档

使用Matplotlib,能够轻易生成各种图像,例如:直方图、波谱图、条形图、散点图等。

入门代码实例

import matplotlib.pyplot as plt
import numpy as np

# 用np.linspace生成50个元素的数组,均匀的分布在(0,2*pi)区间上面
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
# 把x;y函数画出来,用黄色的*-线
plt.plot(x, y, "y*-",label="y=sin(x)")
# 把x,y*2函数画出来,用品红的--线
plt.plot(x, y * 2, "m--", label="y=2sin(x)")

plt.legend()
# plt.legend(loc="best")

plt.title("sin(x) & 2sin(x)")   # 设置标题

plt.xlim(0, 6)  # 设置x坐标轴的范围
plt.ylim(-3, 3)    # 设置y坐标轴的范围
# 通过xticks或yticks来设置轴的刻度。
plt.xticks((0, np.pi * 0.5, np.pi, np.pi * 1.5, np.pi * 2))

plt.xlabel("x")    # 设置x轴的名称
plt.ylabel("y")    # 设置y轴的名称

# 展现
plt.show()

代码解析

1、通过np.linspace生成50个元素均匀的分布在[0,2pi]区间的数组,

2、plt.plot(x,y,"线的样式",label="标记")  # 前两个参数时x,y的取值,第三个参数是线的样式,第四个参数是右上角的标记,和plt.legend()配套使用

3、plt.title("****)设置标题

4、plt.xlim()或plt.ylim()设置x坐标轴或者y坐标轴的范围

5、# 通过xticks或yticks来设置轴的刻度。

6、plt.xlabel("x")设置x轴的名称

常见的颜色

蓝色:b  青色:c  红色:r  黑色:k

绿色:g  品红:r  黄色:y  白色:w

常见的点

点:.  方形:s  圆:o  像素:,  三角形:^

常见的线

直线:-  虚线: - -  点线::  点划线:-.  星号:*

运行结果如下:

添加注释

先上代码;

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 x = np.linspace(0, 2 * np.pi, 50)
 5 y = np.sin(x)
 6 plt.plot(x, y)
 7 
 8 x0 = np.pi
 9 y0 = 0
10 
11 # 画出标注点
12 plt.scatter(x0, y0, s=50)
13 # 右边的
14 plt.annotate('sin(np.pi)=%s' % y0, xy=(np.pi, 0), xycoords='data', xytext=(+30, -30),
15              textcoords='offset points', fontsize=16,
16              arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
17 # 左边的
18 plt.text(0.5, -0.25, "sin(np.pi) = 0", fontdict={'size': 16, 'color': 'r'})
19 
20 plt.show()
View Code

有时候我们需要对特定的点进行标注,我们可以使用 plt.annotate 函数来实现。

这里我们要标注的点是 (x0, y0) = (π, 0)

我们也可以使用 plt.text 函数来添加注释。

对于 annotate 函数的参数,做一个简单解释:

  • 'sin(np.pi)=%s' % y0 代表标注的内容,可以通过字符串 %s 将 y0 的值传入字符串;

  • 参数 xycoords='data' 是说基于数据的值来选位置;

  • xytext=(+30, -30) 和 textcoords='offset points' 表示对于标注位置的描述 和 xy 偏差值,即标注位置是 xy 位置向右移动 30,向下移动30;

  • arrowprops 是对图中箭头类型和箭头弧度的设置,需要用 dict 形式传入。

一次性绘制多个图形

当需要两组数据进行对比,或者一组数据的不同展示方式,我们就可以在一个窗口中绘制多个图形。

多个图形窗口——figure

一个figure就是一个图形窗口,matplotlib.pyplot会有一个默认的figure,

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(100, 201)  # 生成一组100到200,步长为1的数组
# 在第一个默认窗口画
plt.plot(data)  # 绘制data

data2 = np.arange(200,301)
plt.figure(figsize=(6, 3))    # 生成一个图形窗口,设置窗口的大小为(6,3)
# 在第二个窗口画
plt.plot(data2) # 绘制data2

plt.show()  # 展现

代码解析:

1、matplotlib在绘制图形的时候都在一个默认的figure中。我们可以通过plt.figure()再创建一个窗口

2、plt.figure()有figsize参数,以数组形式控制窗口的大小

运行结果如下:

多个子图——subplot

  有时候我们需要将多张子图展示在一起,可以使用 plt.subplot()实现。即在调用plot()函数之前需要先调用 subplot()函数。该函数的第一个参数代表子图的总行数,第二个参数代表子图的总列数,第三个参数代表活跃区域。下面绑定了实例,也可以不绑定。

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)

ax1 = plt.subplot(2, 2, 1) # (行,列,活跃区)
plt.plot(x, np.sin(x), 'r')

ax2 = plt.subplot(2, 2, 2, sharey=ax1) # 与 ax1 共享y轴
plt.plot(x, 2 * np.sin(x), 'g')

ax3 = plt.subplot(2, 1, 2)  # 将窗口分为两行1列,这个图形占第二列
plt.plot(x, np.cos(x), 'b')


plt.show()

代码解析:

1、subplot(2,2,x)表示将图像窗口分为2行2列。x表示当前子图所在的活跃区域。

2、subplot(2,1,2)将窗口分为两行一列,这个图形画在第二列

3、plt.subplot(2,2,2,sharey=ax1)    # 是与ax1函数共享受一个y轴。

运行结果如下:

注意;subplot函数的参数不仅仅支持上面的这种形式,还可以将三个整数(10之内的)合并一个整数。例如:plt.subplot(2,2,1)可以写成plt.subplot(221),结果是一样的。

常用的图形实例

Matplotlib可以生成非常多的图形,常用的有:线形图、散点图、饼状图、条形图、直方图。我们来依次了解一下。

线形图——plot

先上代码

import matplotlib.pyplot as plt

plt.plot([1,2,3],[3,6,9], "-r")
plt.plot([1,2,3],[2,4,9], ":g")

plt.show()

代码解析:

1、plot函数的第一个数组是横轴的值,第二个数组是纵轴的值,

2、最后一个参数是由两个字符构成,分别是线条的样式和颜色。前者是红色的直线,后者是绿色的点线,关于样式和颜色的说明请参见plor函数的APIDoc:matplotlib.pyplot.plot

运行结果如下:

散点图——scatter

先上代码

import matplotlib.pyplot as plt
import numpy as np

plt.subplot(2,1,1)
k = 500
x = np.random.rand(k)
y = np.random.rand(k)
size = np.random.rand(k) * 50 # 生成每个点的大小
colour = np.arctan2(x, y) # 生成每个点的颜色
plt.scatter(x, y, s=size, c=colour)
plt.colorbar() # 添加颜色栏

N = 20
# 参数c表示点的颜色,s是点的大小,alpha是透明度

plt.subplot(2,3,4)
plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c="r", s=100, alpha=0.5)    # 红色

plt.subplot(2,3,5)
plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c="g", s=200, alpha=0.5)    # 绿色

plt.subplot(2,3,6)
plt.scatter(np.random.rand(N) * 100,
            np.random.rand(N) * 100,
            c="b", s=300, alpha=0.5)    # 蓝色

plt.show()

 代码解析

1、这幅图包含三组数据,每组数据都包含了20个随机坐标的位置

2、参数c表示点的颜色,s是点的大小,alpha是透明度

3、plt.colorbar()添加右边的颜色栏

运行结果:

饼状图——pie

先上代码:

import matplotlib.pyplot as plt
import numpy as np

labels = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

data = np.random.rand(7) * 100  # 生成7组随机数

# labels指定标签,autopct指定数值的精度
plt.pie(data, labels=labels, autopct="%1.1f%%")
plt.axis("equal")   # 设置了坐标大小一致
plt.legend()    # 指明要绘制的图例

plt.show()

代码解析:

1、data是一个包含7个数据的随机数值

2、图中的标签通过labels来指定

3、autopct指定了数值的精度格式

4、plt.axis('equal')设置了坐标轴大小一致

5、plt.legend()指明要绘制图例(见下图的右上角)

运行结果:

柱形图——bar

先上代码

import matplotlib.pyplot as plt
import numpy as np

N = 7

x = np.arange(N)

# randint是不是就是去随机的整数呢
# 柱形的高度随机生成
data = np.random.randint(low=0, high=100, size=N)
# 随机生成颜色
colors = np.random.rand(N * 3).reshape(N,-1)
# labels指定了标签
labels = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]

# title指定了图形的标题,
plt.title("Weekday Data")

# alpha是透明度
plt.bar(x, data, alpha=0.8, color=colors, tick_label=labels)

# 增加数值
for x, y in zip(x, data):
    plt.text(x, y , '%.2f' % y, ha='center', va='bottom')

plt.show()

代码解析

1、绘制了7个随机值的高度在[0:100]之间的柱形。

2、colors = np.random.rand(N * 3).reshape(N,-1)表示先生成21(Nx3)个随机数,然后将他们组装成7行,那么每行就是三个数,这对应了颜色的三个组成部分。(这里7行-1列是什么意思呀)

3、title是指图形的标题,labels指定了标签,alpha是透明度

4、plt.text()标记柱形的数值

运行结果

直方图——hist

直方图是描述数据中某范围内数据出现的频率,

先上代码

import matplotlib.pyplot as plt
import numpy as np

# 生成3组数据
data = [np.random.randint(0, n, n) for n in [3000, 4000, 5000]]
labels = ['3K', '4K', '5K'] # 设置标签

# 设置数据点
bins = [0, 100, 500, 1000, 2000, 3000, 4000, 5000]

plt.hist(data, bins=bins, label=labels)
plt.legend()

plt.show()

代码解析

[np.random.randint(0, n, n) for n in [3000, 4000, 5000]]生成了包含三个数组的列表。

  • 第一个数组包含了3000个随机数,这些随机数的范围是 [0, 3000)
  • 第二个数组包含了4000个随机数,这些随机数的范围是 [0, 4000)
  • 第三个数组包含了5000个随机数,这些随机数的范围是 [0, 5000)

 2、bins数组用来指定我们显示的直方图的边界,即:[0, 100) 会有一个数据点,[100, 500)会有一个数据点,以此类推。所以最终结果一共会显示7个数据点。

运行结果

  我们看到,三组数据在3000以下都有数据,并且频度是差不多的。但蓝色条只有3000以下的数据,橙色条只有4000以下的数据。这与我们的随机数组数据刚好吻合。

解决中文乱码问题

默认情况下,Matplotlib中文会出现乱码,只显示方框。

import matplotlib.pyplot as plt

x = ['北京', '上海', '深圳', '广州']
y = [60000, 58000, 50000, 52000]

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

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

 只需要配置一下后台字体就可以了。

 Python 机器学习库 NumPy 教程

猜你喜欢

转载自blog.csdn.net/qq_34218078/article/details/82921913