Matplotlib
(一)、基础知识
1、第一个程序
-
在计算机中通过程序绘图有两种方式:位图和矢量图。位图:就是用一个个像素绘制的图形。矢量图:是将多个点进行连接的图形。Matplotlib所采用的矢量图的绘制方式,也就是连接相邻的两个点形成一条曲线。如果要让曲线平滑,就要取更多的点进行绘制。
-
Matplotlib有很多函数用于绘制各种图形,其中
plot
函数用于曲线,需要传入x坐标和y坐标,然后用show
函数显示。 -
例子:使用
plot
函数绘制一条一元二次方程的曲线,并使用savefig
函数将这条曲线保存到./data/demo1_x.jpg
中import matplotlib.pyplot as plt # 生成200个点的x坐标 x = range(-100, 100) # 生成200个点的y坐标 y = range(-100, 100) y2 = [i ** 2 for i in x] # 指定窗口1 plt.figure(1) # 绘制一元一次曲线 plt.plot(x, y) # 保存 plt.savefig("./data/demo1_1.jpg") # 指定窗口2 plt.figure(2) # 绘制一元二次曲线 plt.plot(x, y2) #保存 plt.savefig("./data/demo1_2.jpg") # 显示 plt.show()
2、绘制正弦、余弦曲线
- 正弦
import matplotlib.pyplot as plt
import numpy as np
# 将0~2pi分成100份,以numpy数组的形式返回这100个x值
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()
- 余弦
import matplotlib.pyplot as plt
import numpy as np
# 将0~2pi分成100份,以numpy数组的形式返回这100个x值
x = np.linspace(0, 2*np.pi, 100)
y = np.cos(x)
plt.plot(x, y)
plt.show()
- 叠加
import matplotlib.pyplot as plt
import numpy as np
# 将0~2pi分成100份,以numpy数组的形式返回这100个x值
x = np.linspace(0, 2*np.pi, 100)
ysin = np.sin(x)
ycos = np.cos(x)
plt.plot(x, ysin)
plt.plot(x, ycos)
plt.show()
3、绘制随机点
- 使用
scatter
函数可以绘制随机点,需要传入x坐标和y坐标 - 例子:使用
scatter
函数绘制1024个随机点
import random
import matplotlib.pyplot as plt
count = 1024
x = [random.random() * 100 for i in range(count)]
y = [random.random() * 100 for i in range(count)]
plt.scatter(x, y)
plt.show()
4、绘制柱状图
- 使用
bar
函数可以绘制柱状图 - 柱状图需要水平的x坐标值,以及每一个x坐标值对应的y坐标值
- 柱状图主要是用来纵向对比和横线对比
- 例子:使用
bar
函数绘制柱状图,并设置柱的宽度
import matplotlib.pyplot as plt
x = [10, 20, 30, 40]
y = [100, 200, 300, 400]
# 通过width参数控制柱的宽度
plt.bar(x, y, width = 3)
plt.show()
- 例子:添加标签
import matplotlib.pyplot as plt
# 数据
labels = ['A', 'B', 'C', 'D', 'E']
values = [10, 24, 36, 40, 15]
# 绘制柱状图
plt.bar(labels, values)
# 添加标题和轴标签
plt.title('Example Bar Chart')
plt.xlabel('Category')
plt.ylabel('Value')
# 显示图形
plt.show()
- 例子:显示柱的数值
import matplotlib.pyplot as plt
x = ['A', 'B', 'C', 'D', 'E']
y = [10, 24, 36, 40, 60]
plt.bar(x, y)
# 在每个柱形上方显示数值
# for i in range(len(y)):
# plt.text(i, y[i] + 1, str(y[i]), ha='center')
# 用枚举法实现
for i, v in enumerate(y):
print(i, v+1, str(v))
#(x轴,y轴,数值,居中显示)
plt.text(i, v + 1, str(v), ha='center')
plt.show()
- 例子:显示多组数据,并标注值,显示图例
import numpy as np
import matplotlib.pyplot as plt
# 数据
data1 = [20, 35, 30, 35, 27]
data2 = [25, 32, 34, 20, 25]
x = np.arange(len(data1))
# 绘制柱状图
plt.bar(x, data1, width=0.4, label='Data 1')
plt.bar(x + 0.4, data2, width=0.4, label='Data 2')
# 添加 x 轴标签和刻度(因为原来的刻度在第一个柱的中间,柱宽位0.4,所以要+0.2)
plt.xticks(x + 0.2, ['a', 'b', 'c', 'd', 'e'])
for i, v in enumerate(data1):
plt.text(i, v + 0.5, str(v), ha='center')
for i, v in enumerate(data2):
plt.text(i + 0.4, v + 0.5, str(v), ha='center')
# 显示图例
plt.legend()
# 显示图形
plt.show()
涉及其他语法
- 在使用
enumerate()
遍历可迭代对象时,会返回一个迭代器,迭代器的每个元素是一个元组,其中第一个元素是索引,第二个元素是对应的值。
my_list = ['apple', 'banana', 'orange']
for index, value in enumerate(my_list):
print(index, value)
0 apple
1 banana
2 orange
5、绘制直方图、盒状图
- 直方图与柱状图的风格类似,都是由若干个柱组成的,但直方图和柱状图的含义却有很大差异
- 直方图是用来观察分布状态的,而柱状图是用来看每一个x坐标对应y值
- 也就是说,直方图关注得是发布,并不关心某个值,而柱状图关注得是具体某个值
- 盒状图与直方图都是表示发布状态得,不过盒状图还有一个功能,就是能体现数据得平均值(盒状图中间的红线)
- 使用
hist
函数可以绘制直方图,需要传入两个参数值,第一个参数值用于指定数据序列,第二个参数值表示x轴得发布区域,一般这个参数值与数据序列得个数相同 boxplot
函数用于绘制盒状图,该函数只需要传入数据序列即可- 例子:使用
hist
函数盒boxplot
函数绘制100个随机数得发布状态
import matplotlib.pyplot as plt
import numpy as np
# 标准正态分布中(均值为0,方差为1)
data = np.random.randn(100)
# 这个函数返回两个对象,一个是图形对象(fig),另一个是包含两个子图对象的元组。在这里,子图对象被命名为 a 和 b,它们可以用来分别绘制两个子图。
fig, (a, b) = plt.subplots(1, 2)
a.hist(data, 100)
b.boxplot(data)
plt.show()
盒状图中间的红线表示平均值,盒状图的纵坐标表示100个随机数的取值范围,可以看出,随机数大多早-2~2之间。
不管盒状图,还是直方图,都可以了解这100个随机数的分布
6、绘制饼图
- 使用
pie
函数可以绘制饼图 pie
函数只要传入数据即可
import matplotlib.pyplot as plt
data = [5, 23, 32, 11, 2]
plt.pie(data)
plt.show()
- 其中,
x
是饼图中每个类别所占的比例,是一个一维数组。labels
是每个类别的标签,也是一个一维数组,可以为None
。explode
是一个一维数组,用于控制每个类别之间的距离,默认为None
。autopct
参数可以指定每个扇形显示的比例值,例如 ‘%1.1f%%’ 表示保留一位小数的百分数,可以为None
。shadow
参数用于显示阴影,可以为True
或False
。
import matplotlib.pyplot as plt
plt.pie(x, labels=None, explode=None, autopct=None, shadow=False)
plt.show()
- 这个例子中,我们首先定义了每个类别的标签
labels
、占比比例sizes
和颜色colors
,然后定义了每个扇形之间的距离explode
。最后,我们使用pie
函数绘制了饼图,并使用axis
函数设置了 x 轴和 y 轴的比例相等,使饼图成为一个圆形。
import matplotlib.pyplot as plt
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 20, 10, 25]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'red']
explode = (0.1, 0, 0, 0, 0)
'''
第一个%:表示开始字符串格式化
%1.1f:表示一个浮点数,其中1.1是格式化选项,.1表示小数点后保留1位,1表示输出宽度为1,不足补空格
第二个%:表示字符串中要输出一个百分号字符
第三个%:表示结束字符串格式化
shadow=True是指在饼图下方增加一个阴影,以突出显示饼图的浮出效果
'''
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True)
plt.legend()
plt.axis('equal')
plt.show()
(二)、定制颜色盒样式
1、定制曲线颜色
plot
函数可以通过color
关键字参数指定曲线的颜色,matplotlib支持多种颜色类型,如预定颜色、html颜色、灰度等。
预定颜色如:
- blue - 蓝色
- green - 绿色
- red - 红色
- cyan - 青色
- magenta - 品红色
- yellow - 黄色
- black - 黑色
- white - 白色
-
html颜色就以井号(#)开头的颜色值;灰度是介于0到1的浮点数,0表示黑色,1表示白色
-
例子:
import numpy as np
import matplotlib.pyplot as plt
# 将-6到6分成1024份,形成1024个值
x = np.linspace(-6, 6, 1024)
# 也可以使用以上的几个颜色的首字母作为颜色的表达
colors = ['red', 'yellow', 'b', 'c', '#FF00FF', '0.75']
for i in range(10):
plt.plot(x, -x**2 + (i+1)*2, color = colors[i % len(colors)])
plt.show()
2、定制离散点的样式
- 离散点的样式主要包括颜色、边缘颜色、边缘宽度、尺寸等。可以定制离散点的颜色、边缘颜色、边缘宽度和尺寸等。
- 通过
scatter
函数的color
关键字参数设置离散点的颜色,通过edgecolor
关键字参数设置边缘颜色,通过s
关键字参数设置尺寸,通过linewidth
关键字参数设置边缘宽度 - 例子:
import numpy as np
import matplotlib.pyplot as plt
# 产生1组标准正态发布的随机数,100是numpy数组元素个数,2是数组的维度
data1 = np.random.standard_normal((100, 2))
# 将data1中的数据都加-1
data1 += np.array((-1, -1))
data2 = np.random.standard_normal((100, 2))
data2 += np.array((-1, -1))
colors = ['red', 'yellow', 'b', 'c', '#FF00FF', '0,75']
# 将data1的所有数据中的字列表的第一个数据作为x轴的值,同理第二个数据作为y轴的值
plt.scatter(data1[:, 0], data1[:, 1], color = colors[0])
plt.scatter(data2[:, 0], data2[:, 1], color = colors[2])
# 修改点的样式
plt.scatter(data1[:, 0], data1[:, 1], color = colors[4], edgecolors = colors[1], s = 100, linewidths = 3)
plt.show()
- 语法解释:
import numpy as np
# 产生1组标准正态发布的随机数,100是numpy数组元素个数,2是数组的维度
data1 = np.random.standard_normal((2, 2))
print(data1)
# 将data1中的数据都加-1
data1 += np.array((-1, -1))
print(data1)
[[ 0.36356241 1.09262989]
[-2.08869307 -0.37254382]]
[[-0.63643759 0.09262989]
[-3.08869307 -1.37254382]]
3、定制柱状图颜色
- 通过
bar
函数的color
关键字参数可以设置柱状图的颜色,color
参数可以是一个颜色值,也可以是颜色值的序列。 - 例子:
import random
import matplotlib.pyplot as plt
# 产生50个0~99的随机数,作为x轴的坐标值
values = [random.randint(0, 99) for i in range(50)]
colors = ['#FF00FF', '#FFFF00', 'r', 'b']
colors_set = [colors[i%len(colors)] for i in range(50)]
plt.bar(range(1, len(values)+1), values, color=colors_set)
plt.show()
4、定制饼图颜色
colors
参数的颜色值序列应该有足够多的颜色值供pie
函数选择,否则有肯能相邻部分的颜色值相同或者类似- 例子:
import random
import matplotlib.pyplot as plt
values = [random.random() for i in range(5)]
colors = ['b', 'r', 'g', 'c', 'm']
# 注意这里是colors参数
plt.pie(values, colors=colors, labels = colors, autopct = '%.1f%%')
plt.legend()
plt.show()
5、定制曲线类型
- 设置
plot
函数的linestyle
关键字参数可以改变曲线的类型,该参数值是字符串类型。默认是实线(solid)、虚线(dashed)、点画线(dashdot)、虚线(dotted) - 例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-6, 6, 1024)
plt.plot(x, -x ** 2, color = 'r', linestyle = 'solid')
plt.plot(x, -x ** 2 + 3, color = 'b', linestyle = 'dashed')
plt.plot(x, -x ** 2 + 6, color = 'c', linestyle = 'dashdot')
plt.plot(x, -x ** 2 + 9, color = 'g', linestyle = 'dotted')
plt.show()
- 简便写法:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-6, 6, 1024)
plt.plot(x, -x ** 2, color = 'r', linestyle = '-')
plt.plot(x, -x ** 2 + 3, color = 'b', linestyle = '--')
plt.plot(x, -x ** 2 + 6, color = 'c', linestyle = '-.')
plt.plot(x, -x ** 2 + 9, color = 'g', linestyle = ':')
plt.show()
6、定制柱状图的填充模式
- 通过
bar
函数的hatch
关键字参数可以设置柱状图的填充模式,默认填充模式的实心。hatch
参数值是一个字符,不过字符并不能随便设置,有一些固定的字符,如:**“x”,“*”,“-”,“+”,“/”**等。 - 例子:
import numpy as np
import matplotlib.pyplot as plt
n = 8
# 产生8个0~1的随机数
a = np.random.random(n)
b = np.random.random(n)
# 设置柱状图下半部分的填充模式为"x"
plt.bar(range(1, n+1), a, color='b', hatch="+")
# 设置柱状图上半部分的填充模式为"*",同时将a放在下方(这个柱距离下方有a的距离)
plt.bar(range(1, n+1), a+b, bottom = a, color='r', hatch="*")
plt.show()
- 例子:显示3个柱
import numpy as np
import matplotlib.pyplot as plt
n = 8
a = np.array([1, 1, 1, 1, 1, 1, 1, 1])
b = np.array([1, 1, 1, 1, 1, 1, 1, 1])
# 设置柱状图下半部分的填充模式为"x"
plt.bar(range(1, n + 1), a, color = 'b', hatch = "+")
# 设置柱状图上半部分的填充模式为"*"
plt.bar(range(1, n + 1), a + b, bottom = a, color = 'r', hatch = "*")
plt.bar(range(1, n + 1), a + b + b, bottom = a + a + b, color = 'c', hatch = "-")
plt.show()
(三)、注释
1、在坐标上显示标题
- 使用
title
函数直接在坐标系上显示标题 - 例子:
import numpy as np
import matplotlib.pyplot as plt
# 如果标题包含中文字符,要加上以下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 启用unicode编码支持特殊字符
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-4, 4, 1024)
y = 0.25 * (x + 4) * (x + 1) * (x - 2)
plt.plot(x, y, color="r")
# 添加标题
plt.title("标题Text")
plt.show()
-
plt.title()
函数还可以设置标题的字体大小、颜色、字体样式等属性。例如,设置字体大小和颜色:pythonCopy code plt.title('图表标题', fontsize=16, color='blue')
2、使用LaTex格式的标题
- 如果标题是普通文本,直接使用
title
函数设置即可。 - 如果标题要显示如数学公式,就需要使用
LaTex
格式的文本来设置标题 LaTex
是著名的排版系统,可以用一些特殊的表示法通过文本来描述数学公式- 例子:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4, 4, 1024)
y = 0.25 * (x + 4) * (x + 1) * (x - 2)
plt.plot(x, y, color='b')
# 以$开始,$结束,\frac{a}{b}是分数的形式
plt.title(r'$f(x)=\frac{1}{4}(x+4)(x+1)(x-2)$')
plt.show()
3、为x、y轴添加注释
- 使用
xlabel
函数和ylabel
函数可以将注释添加到x坐标轴和y坐标轴上 - 例子:
import numpy as np
import matplotlib.pyplot as plt
# 如果标题包含中文字符,要加上以下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 启用unicode编码支持特殊字符
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-4, 4, 1024)
y = 0.25 * (x + 4) * (x + 1) * (x - 2)
plt.plot(x, y, color="r")
# 添加标题
plt.title("标题Text")
plt.xlabel("x轴Text")
plt.ylabel("y轴Text")
plt.show()
4、坐标系内添加文本注释
- 使用
text
函数,需要传入x轴值,y轴值,文本值 - 例子:
import numpy as np
import matplotlib.pyplot as plt
# 如果标题包含中文字符,要加上以下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 启用unicode编码支持特殊字符
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-4, 4, 1024)
y = 0.25 * (x + 4) * (x + 1) * (x - 2)
plt.plot(x, y, color="r")
# 添加标题
plt.title("标题Text")
plt.xlabel("x轴Text")
plt.ylabel("y轴Text")
# 指定x,y轴的值设置文本
plt.text(0, -2, '坐标系内备注')
plt.show()
5、为文本注释添加Box
text
函数还能为注释设置边框,背景色、文本颜色等样式,这些样式要依赖text
函数的bbox
关键字参数。该参数是字典类型,字典的每一个key就是一个样式,如facecolor
表示背景颜色- 例子:
import numpy as np
import matplotlib.pyplot as plt
# 如果标题包含中文字符,要加上以下代码
plt.rcParams['font.sans-serif'] = ['SimHei']
# 启用unicode编码支持特殊字符
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-4, 4, 1024)
y = 0.25 * (x + 4) * (x + 1) * (x - 2)
plt.plot(x, y, color="r")
# 添加标题
plt.title("标题Text")
plt.xlabel("x轴Text")
plt.ylabel("y轴Text")
# 设置bbox
box = {
'facecolor': 'r',
'edgecolor': 'b',
'boxstyle': 'round'
}
# 指定x,y轴的值设置文本
plt.text(0, -1, '坐标系内备注', bbox=box)
plt.show()