文章目录
- 一、第一个 Matplotlib 绘图程序
- 1. Matplotlib 绘图的基本步骤
- 二、Matplotlib 的基本方法
- 1. 图表名称 plt.title()
- 2. x 轴和 y 轴名称
- 3. 设置 x 轴和 y 轴的刻度
- 4. 显示图表 show()
- 5. 图例 legend()
- 6. 图例的图例位置设置
- 7. 显示每条数据的值 x,y 值的位置
一、第一个 Matplotlib 绘图程序
- 与 NumPy 类似,我们可以使用相同的方法查看 Matplotlib 的版本信息。
import matplotlib
matplotlib.__version__
#'2.2.3'
1. Matplotlib 绘图的基本步骤
- (1) 首先导入 Matplotlib 包中的 Pyplot 模块,并以 as 别名的形式简化引入包的名称。
from matplotlib import pyplot as plt
#import matplotlib.pyplot as plt
- (2) 接下来,使用 NumPy 提供的函数 arange() 创建一组数据来绘制图像。
- 引入 numpy 包,我们获取 -50 到 50 之间的 ndarray 对象(由于 arange() 不含终止值,因此,我们需要到 51)。
import numpy as np
x = np.arange(-50,51)
x
#array([-50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38,
# -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25,
# -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12,
# -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 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, 42, 43, 44, 45, 46, 47, 48, 49, 50])
- (3) 上述所得 x 的值作用到 x 轴上,而该值对应的平方值,也就是 y 值,使用以下方式获取。
y = x **2
y
#array([2500, 2401, 2304, 2209, 2116, 2025, 1936, 1849, 1764, 1681, 1600,
# 1521, 1444, 1369, 1296, 1225, 1156, 1089, 1024, 961, 900, 841,
# 784, 729, 676, 625, 576, 529, 484, 441, 400, 361, 324,
# 289, 256, 225, 196, 169, 144, 121, 100, 81, 64, 49,
# 36, 25, 16, 9, 4, 1, 0, 1, 4, 9, 16,
# 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225,
# 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676,
# 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369,
# 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304,
# 2401, 2500], dtype=int32)
- (4) 使用 plt 的 plot() 函数对 x、y 进行绘制。
plt.plot(x,y)

二、Matplotlib 的基本方法
| 方法名 | 说明 |
|---|---|
| title() | 设置图表的名称 |
| xlabel() | 设置x轴名称 |
| ylabel() | 设置y轴名称 |
| xticks(ticks,label,rotation) | 设置x轴的刻度,rotation旋转角度 |
| yticks() | 设置y轴的刻度 |
| show() | 显示图表 |
| legend() | 显示图例 |
| text(x,y,text) | 显示每条数据的值 x,y值的位置 |
1. 图表名称 plt.title()
- x 轴获得 -50 到 50 之间的 ndarray 对象(由于 arange() 不含终止值,因此,我们需要到 51),y 轴的值是 x 轴的平方。
- 然后,我们将图表的名称设置为 y= x^2,最后绘制图形即可。
import numpy as np
x = np.arange(-50,51)
y = x **2
plt.title("y= x^2")
plt.plot(x,y)

- 那么,我们是否可以将标题写为中文呢?
plt.title("y等于x的平方-")
plt.plot(x,y)

- 会发现图表标题跟我们想象中的不太一样,这是因为默认不支持中文:missing from current font 字体丢失造成的。
- 因此,我们可以通过如下代码修改字体配置。
plt.rcParams["font.sans-serif"]
- 字体说明详见下表。
| 中文字体 | 说明 |
|---|---|
| ‘SimHei’ | 中文黑体 |
| ‘Kaiti’ | 中文楷体 |
| ‘LiSu’ | 中文隶书 |
| ‘FangSong’ | 中文仿宋 |
| ‘YouYuan’ | 中文幼圆 |
| STSong | 华文宋体 |
- 我们可以使用我们需要的中文信息进行图表标题的临时配置,就可以成功完成我们的需求了。
plt.rcParams['font.sans-serif'] = ["FangSong"]
plt.title("y等于x的平方--")
plt.plot(x,y)

- 这里我们需要注意的是,在字体设置的过程中,字体名称是不区别大小写的。
- 因此,我们在尝试下别的字体。
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.title("y等于x的平方")
plt.plot(x,y)

- 但是通过上述的图表当中,我们又会发现,当我们设置了中文字体后,坐标轴的负数又没办法正确显示了。
- 对此,我们可以创建 x 为 -10 到 10 的整数,y 是 x 的平方。
import numpy as np
x = np.arange(-10,11)
y = x ** 2
plt.plot(x, y)

- 这里我们需要注意的是,当我们的字体设置支持中文后,必须设置负号,否则当数值中出现负值时,负号就无法正常显示。
- 对此,我们可以通过修改坐标轴中的负号编码进行解决。我们可以创建 x 为 -10 到 10 的整数,y 是 x 的平方,并设置标题,用以对比观察。
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(-10,11)
y = x ** 2
plt.title('y=x^2 x取值范围为:[-10,10)')
plt.plot(x, y)

- 对上述的字体问题进行总结可得:如果我们想要在标题当中显示中文,就需要修改 2 个配置信息:
- (1) plt.rcParams[‘font.sans-serif’]=[‘SimHei’] ,用来设置字体样式以正常显示中文标签。
- (2) plt.rcParams[‘axes.unicode_minus’]=False ,默认是使用 Unicode 负号,设置正常显示字符。
2. x 轴和 y 轴名称
- x 轴的名称通过 xlabel() 进行设置。
- y 轴的名称通过 ylabel() 进行设置。
- 对此,我们创建一个 x 为 -10 到 10 的整数,y 是 x 的平方的数组,并将其标题设置为 y=x^2 x取值范围为:[-10,10),将 x 轴的名称设置为 x 轴,y 轴的名称设置为 y 轴。
x = np.arange(-10,10)
y = x ** 2
plt.title('y=x^2 x取值范围为:[-10,10)')
plt.xlabel("x 轴")
plt.ylabel("y 轴")
plt.plot(x, y)

- 对于上面的图,如果我们觉得字体偏小或线条太细,可以设置标签文字大小和线条粗细。
- (1) 通过 fontsize 参数,设置文字大小。
- (2) 通过 linewidth 参数,设置线条粗细。
- 为了便于与上述图表当中的字体和线条进行比对,我们便创建与上述完全相同的数组(一个 x 为 10 到 10 的整数,y 是 x 的平方的数组,并将其标题设置为 y=x^2 x取值范围为:[-10,10),将 x 轴的名称设置为 x 轴,y 轴的名称设置为 y 轴),并使用 fontsize 参数将文字大小设置为 12,使用 linewidth 参数将线条宽度设置为 5。
x = np.arange(-10,10)
y = x ** 2
plt.title('y=x^2 x取值范围为:[-10,10)',fontsize=16)
plt.xlabel("x 轴",fontsize=12)
plt.ylabel("y 轴")
plt.plot(x, y,linewidth=5)

- 我们也可以在一个图表当中,设置两种线条宽度。
plt.plot(x, y,linewidth=1)
plt.plot(x, y,linewidth=5)

- 运行结束上面代码后,除了线条变化外,我们发现可以在一张图片中绘制多个线条。
- 对此,我们创建一个 x 为 10 到 10 的整数,y1 是 x 的平方的数组,y2 就等于 x,并将其标题设置为 y=x^2 x取值范围为:[-10,10),同时,标题的文字大小设置为 16,将 x 轴的名称设置为 x 轴,使用 fontsize 参数将文字大小设置为 12,y 轴的名称设置为 y 轴。
x = np.arange(-10,11)
y1 = x ** 2
y2 = x
plt.title('y=x^2 x取值范围为:[-10,10)',fontsize=16)
plt.xlabel("x 轴",fontsize=12)
plt.ylabel("y 轴")
plt.plot(x, y1)
plt.plot(x, y2)

3. 设置 x 轴和 y 轴的刻度
- 我们可以通过 matplotlib.pyplot.xticks(ticks=None, labels=None, **kwargs) 设置 x 轴的刻度。
- 我们可以通过 matplotlib.pyplot.yticks(ticks=None, labels=None, **kwargs) 设置 y 轴的刻度。
- 其中参数具有如下含义:
- ticks:此参数是 xtick 位置的列表,是一个可选参数。如果将一个空列表作为参数传递,则它将删除所有 xticks。
- label:此参数包含放置在给定刻度线位置的标签,它是一个可选参数。
- **kwargs:此参数是文本属性,用于控制标签的外观,例如:
- rotation 表示旋转角度,例如:rotation=45。
- color表示颜色,例如:color=“red”。
- 那么,xticks 到底有什么用呢?
- 其实就是把坐标轴变成我们想要的样子。
- 例如,我们将 x 轴设置为时间,y 轴设置为销量,x 轴具体数据使用 np.arange() 生成,y 轴具体数据使用 np.random.randint() 生成。
times = np.arange(1990,2020).astype(np.str_)
sales = np.random.randint(500,2000,size=len(times))
plt.xticks(range(0,len(times),2),['%s年'%i for i in times],rotation=45)
plt.plot(times,sales)

上述图表,就是每个时间点的销量绘图,如果 x 轴的数据是字符串,那么就会将数据全部展示(y 轴销售量数据仍通过 np.random.randint() 生成)。
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
sales =np.random.randint(500,2000,size=len(times))
plt.plot(times,sales)

- 显而易见,在上述图形当中,x 轴存在一个问题。
- 如果我们只想显示部分时间,或者按照某个规则展示,应该如何处理呢?
- 这个时候我们就需要用到 xticks。
plt.xticks(range(0,len(times),2))
plt.plot(times,sales)

- 通过设置,时间虽然少了,但是如果我们可以让横坐标中的字体倾斜,就可以避免 x 轴坐标刻度重叠。而其中,xticks 第一个参数中元素的值,代表原始数据的索引。
plt.xticks(range(0,len(times),2),labels=['日期:%s'%i for i in times], rotation=45, color='red')
plt.plot(times,sales)

4. 显示图表 show()
- show() 可以用来显示所有打开的图形。
- 在 jupyter notebooks 当中,会自动显示图形。
- 如果我们想在 jupyter 中出现图形操作菜单,可以使用 matplotlib 中的魔术方法 %matplotlib notebook 即可。
%matplotlib notebook
- 之后在运行图表生成代码就会得到如下结果。
plt.xticks(range(1,len(times),2),rotation=45)
plt.plot(times,sales)

- 如果我们想要返回原先的展示,,用另一个 matplotlib 中的魔术方法 %matplotlib inline 即可。
%matplotlib inline
plt.xticks(range(1,len(times),2),rotation=45)
plt.plot(times,sales)

5. 图例 legend()
- 图例 legend() 是集中于地图一角或一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的认识地图。

- 对此,我们以上述数组为例,进行图例的设置,一个是收入,另一个是支出,均通过 np.random.randint() 进行数据的生成。
- 需要注意的是,在使用图例前需要为每个图形设置 label 参数,默认会使用每个图形的 label 值作为图例中的说明。
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
income =np.random.randint(500,2000,size=len(times))
expenses =np.random.randint(300,1500,size=len(times))
plt.xticks(range(1,len(times),2),rotation=45)
plt.plot(times,income,label="收入")
plt.plot(times,expenses,label="支出")
plt.legend()

6. 图例的图例位置设置
- loc 代表了图例在整个坐标轴平面中的位置(一般选取 ‘best’ 这个参数值)。
- 第一种情况默认是 “best”,图例自动‘安家’在一个坐标面内的数据图表最少的位置。
- 第二种情况 loc = ‘XXX’ 分别有 0:‘best’ (自动寻找最好的位置)。
| 位置字符串 | 位置值 | 备注 |
|---|---|---|
| “best” | 0 | 自动寻找最好的位置 |
| “upper right” | 1 | 右上角 |
| “upper left” | 2 | 左上角 |
| “lower left” | 3 | 左下角 |
| “lower right” | 4 | 右下角 |
| “right” | 5 | 右边中间 |
| “center left” | 6 | 左边中间 |
| “center right” | 7 | 右边中间 |
| “lower center” | 8 | 中间最下面 |
| “upper center” | 9 | 中间最上面 |
| “center” | 10 | 正中心 |
- 对此,我们以上述数组为例,进行图例的设置,一个是收入,另一个是支出,均通过 np.random.randint() 进行数据的生成。
- 需要注意的是,在使用图例前需要为每个图形设置 label 参数,默认会使用每个图形的 label 值作为图例中的说明。
- 我们将图例放到整体的左上角。
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
income =np.random.randint(500,2000,size=len(times))
expenses =np.random.randint(300,1500,size=len(times))
plt.xticks(range(1,len(times),2),rotation=45)
plt.plot(times,income,label="收入")
plt.plot(times,expenses,label="支出")
plt.legend(loc="upper left")

7. 显示每条数据的值 x,y 值的位置
- 通过如下代码进行实现。
plt.text(x,y, string, fontsize=15, verticalalignment="top", horizontalalignment="right")
- 其中参数具有如下含义:
- x,y 表示的是坐标值上的值。
- string 表示说明文字。
- fontsize 表示字体大小。
- verticalalignment:(va)垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]。
- horizontalalignment:(ha)水平对齐方式 ,参数:[ ‘center’ | ‘right’ | ‘left’ ]。
- 对此,我们以上述数组为例,进行图例的设置,一个是收入,另一个是支出,均通过 np.random.randint() 进行数据的生成。
- 需要注意的是,在使用图例前需要为每个图形设置 label 参数,默认会使用每个图形的 label 值作为图例中的说明,图例放到整体的左上角。
- 将每个数据的 y 值(也就是收入和支出)显示出来。
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
income =np.random.randint(500,2000,size=len(times))
expenses =np.random.randint(300,1500,size=len(times))
plt.xticks(range(1,len(times),2),rotation=45)
plt.plot(times,income,label="收入")
plt.plot(times,expenses,label="支出")
plt.legend(loc="upper left")
for x,y in zip(times,income):
plt.text(x,y,'%s万'%y)




















