目录
7.折线图
一、pyplot基础
1.导入
import matplotlib.pyplot as plt
2.figure()
3. show()/imshow()
4.plot() 入门 ->画出图像
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()
函数来保存图像。函数格式如下:
plt.savefig(fname, dpi=None, facecolor='w', edgecolor='w')
其中,
fname
的作用是指定保存的文件名。例如当fname
的值为 'my_img' 时保存好的图像文件的名称就是 'my_img'。
dpi
的作用是指定输出文件的分辨率,默认和原图像保持一致。
facecolor
和edgecolor
的作用和figure()
函数一致。
7.subplot()/subplots()
如果我想同时显示多张图片呢?一个办法就是每次输出一张图片都用
figure()
函数打开一个新的图像窗口;另一个办法是使用subplot()
和subplots()
函数一次在一个图像窗口中显示多张图片。标准的subplots()
和subplot
函数的格式如下所示:
subplot的返回值
示例:
①均分
plt.figure()
plt.subplots(2,3)
② 非均分
plt.figure()
plt.subplot(2,2,1)
plt.subplot(2,2,3)
plt.subplot(1,2,2)
-> 除了显示图像,我们还可以更改其中的一些设定。例如如果我们希望去除上图中所有的刻度,可以通过
xticks([])
和yticks([])
实现:
plt.figure()
plt.subplot(2,2,1)
plt.xticks([])
plt.yticks([])
plt.subplot(2,2,3)
plt.xticks([])
plt.yticks([])
plt.subplot(1,2,2)
plt.xticks([])
plt.yticks([])
二、 plot() 类函数进阶
1.绘制颜色
在 plot()
中,输出的颜色通过颜色字符控制:
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
'b' | 蓝色 | 'm' | 洋红色 |
'g' | 绿色 | 'y' | 黄色 |
'r' | 红色 | 'k' | 黑色 |
'c' | 青绿色 | 'w' | 白色 |
'#000000' | RGB色彩,这里是黑色 | '0.8' | 灰度计数 |
当我们要指定颜色时,可以在对应数据的后面添加上相应的颜色字符。举个例子,下面这段代码的运行结果如图所示:
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()
2. 风格字符
另一种划分数据的方式是使用不同风格的线条。改变线条的风格可以通过风格字符实现:
风格字符 | 说明 |
---|---|
'-' | 实线 |
'--' | 破折线 |
'-.' | 点划线 |
':' | 虚线 |
'' '' | 无线条 |
当我们要指定线的风格时,可以在对应数据的后面添加上相应的风格字符。下面这段代码的运行结果如图所示:
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()
3. 标记字符
有时候我们希望看到数据点在原图中的位置。此时我们就可以通过设定标记字符来绘制数据点。
标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|
'.' | 点标记 | '4' | 右花三角标记 |
',' | 极小点标记(像素) | 's' | 实心方形标记 |
'o' | 实心圈标记 | 'p' | 实心五角标记 |
'v' | 倒三角标记 | '*' | 星形标记 |
'^' | 上三角标记 | 'h' | 竖六边形标记 |
'>' | 右三角标记 | 'H' | 横六边形标记 |
'<' | 左三角标记 | '+' | 十字标记 |
'1' | 下花三角标记 | 'x' | x标记 |
'2' | 上花三角标记 | 'D' | 菱形标记 |
'3' | 左花三角标记 | 'd' | 瘦菱形标记 |
'|' | 垂直线标记 |
当我们要生成指定风格的数据点时,可以在对应数据的后面添加上相应的标记字符。下面这段代码的运行结果如图所示:
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()
4. 复合控制字符
在下面的例子中,我们将绘制绿色g的点划线-.,数据点用瘦菱形d标记:
plt.plot(x_label, x_label*1., 'gd-.')
plt.show()
上述代码的运行结果如下所示:
在样例中,我们将 绿色,点划线,瘦菱形标记 各自的控制字符组合在一起形成了复合控制字符 'gd-.'
,注意这是一整个字符串。
补充:空心圆的绘制
三、刻度、标签、图例
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()
上面的图像将作为本节中的原始图像。
如果我们需要将数据放在更大的范围内显示,我们可以通过如下方式进行调整:
(两种方法)
法一:ax控件(接收subplot的第二个参数) ax.set_xlim([0,20])
法二:plt.xilm([0,20])
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()
可以看到这里 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()
上述代码的运行结果如图所示:
这里我们需要注意三点:
首先刻度不一定可以铺满整个坐标轴,如果无法铺满则剩下的部分不会显示刻度;
第二,
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()
上述代码的运行结果如下所示:
这里需要注意,一般来说 set_xtickslabels()
需要配合固定且刻度数量和刻度标签数量相同的刻度。如果两者数量不符则会报错。
4. 坐标轴标签和标题
没有坐标轴标签的话很多时候我们会不知道每个坐标轴究竟代表了什么。这里我们可以通过 ax.set_xlabel()
和 ax.set_ylabel()
或者 plt.xlabel()
和 plt.ylabel()
来实现。
有时候我们需要写出来这张图像的标题是什么,我们可以通过 ax.set_title()
或者 plt.title()
来设置标题。
5. 图例
通过 ax.legend()
或者 plt.legend()
添加图例。
在添加图例之前,我们需要指定每组数据的名称。
注:在使用
plt.legend()
时,我们需要在plt.legend()
函数内按照顺序指定数据名称;在使用ax.legend()
时,则是在绘制图像(例如ax.plot()
)时指定数据名称。
上述两类函数的具体实现过程可以参考下面的例子:
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()
上述代码的运行结果如下所示:
四、绘图函数
经过几节的学习,我们已经基本上掌握了图像的读取、显示、储存,各类样式设置及最常见的折线图绘图函数 plot()
。在本节中我们将深入学习如何通过 matplotlib
绘制其他各类图像。
1. 饼状图
通过扇形的圆心角度数来表示某类数据占总数据的百分比。绘制饼状图通常我们会通过 plt.pie()
函数进行绘制。标准的 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)
图像如下:
2. 直方图
可以很好的展示数据分布情况的图表。通常用横轴表示数据范围,纵轴表示分布情况。正态分布通常就是以直方图的形式展示出来。绘制直方图可以通过 plt.hist()
函数实现。标准的 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)
图像如下:
3. 柱状图
柱状图又被称之为条形图,是一种非常常用的图表。柱状图可以很好的比较各类数据之间的大小关系。绘制柱状图可以通过 plt.bar()
函数实现。标准的 bar()
函数格式如下:
bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
这里我们介绍几个最常用的参数:
x
: 数据点的横坐标
height
: 柱的高度
width
: 柱的宽度
label
: 额外参数,用来指定每种数据的标签,后续可以生成图例
color
: 额外参数,用来指定柱的颜色
4. 水平柱状图
常见的柱状图 X 轴水平,Y 轴垂直。有时候我们需要将两个轴反过来,这时候就可以使用 plt.barh()
函数绘制水平柱状图。标准 barh()
函数的格式如下:
barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
水平柱状图的参数和柱状图基本一致,区别是 X 轴和 Y 轴互换。
完整的 API 描述可以参考[object Object]的官方文档。
假设我们有如下数据和参数:
# 生成第一组数据
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()
图像如下:
5. 堆叠柱状图
堆叠柱状图属于复合图表的一种,既可以表现出不同 label 间的大小差异,又可以表现出 label 内部不同类别的比例关系。堆叠柱状图也是通过 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()
图像如下:
6. 散点图
散点图指通过对应坐标确定位置并绘制坐标点的图表。通过观察坐标点的分布,我们可以知道变量间是否存在关系或者数据的分布是否符合某种模式。我们可以通过 plt.scatter()
函数绘制散点图。标准的 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
: 数据点的样式scatter函数参数详解https://blog.csdn.net/orangefly0214/article/details/78725328plt中cmap的值https://www.csdn.net/tags/MtjaYgysNzQ4NzctYmxvZwO0O0OO0O0O.html