当前位置:   article > 正文

Python模块之Matplotlib模块学习笔记_plt.legend()

plt.legend()

目录

一、绘图基础知识

二、相关函数简介

三、绘图步骤

1、Figure

2、Axes

3、绘图属性设置

4、添加图表标题和坐标轴标题

5、图例说明

6、绘图的注释

7、区间上下限

8、绘图的填充

9、设置网格线

10、区间分段

11、布局

12、轴相关

四、基本绘图2D

1、线图

2、散点图

3、条形图 

4、直方图

5、饼图

6、箱型图

7、气泡图

8、等高线(轮廓图)

9、制作组合图表


Jupyter notebook中进行交互式绘图,需要执行一下语句% matplotlib notebook

一、绘图基础知识

二、相关函数简介

  1. #导入matplotlib的pyplot模块
  2. import matplotlib.pyplot as plt
  1. figure():创建一个新的绘图窗口。
  2. figtext():为figure添加文字
  3. axes():为当前figure添加一个坐标轴
  4. plot():绘图函数
  5. polar():绘制极坐标图
  6. axis():获取或设置轴属性的边界方法(坐标的取值范围)
  7. clf : 清除当前figure窗口 cla : 清除当前axes窗口
  8. close : 关闭当前figure窗口
  9. subplot : 一个图中包含多个axes
  10. text(): 在轴上添加文字
  11. title(): 设置当前axes标题
  12. xlabel/ylabel:设置当前X轴或Y轴的标签
  13. hist():绘制直方图
  14. hist2d():绘制二维在直方图
  15. hold :设置当前图窗状态;off或者on
  16. imread():读取一个图像,从图形文件中提取数组
  17. legend():为当前axes放置标签
  18. pie():绘制饼状图
  19. scatter():做一个X和Y的散点图,其中X和Y是相同长度的序列对象
  20. stackplot():绘制一个堆叠面积图
  21. acorr():绘制X的自相关函数
  22. annotate():用箭头在指定的数据点创建一个注释或一段文本
  23. bar():绘制垂直条形图 barh():绘制横向条形图
  24. barbs():绘制一个倒钩的二维场

三、绘图步骤

1、Figure

绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画板才能开始绘图

def figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=Figure, clear=False, **kwargs)

  1. import matplotlib.pyplot as plt
  2. fig = plt.figure(figsize=(a, b),dpi=dpi)
  3. #figsize 设置图形的大小,a 为图形的宽, b 为图形的高,单位为英寸
  4. #dpi 为设置图形每英寸的点数

则此时图形的像素为:

px, py = a*dpi, b*dpi # pixels

# e.g.

# 6.4 inches * 100 dpi = 640 pixels

也就是说,同一像素尺寸的图形(比如 1200 * 600)可以有任意种不同的组合,比如:

figsize=(15,7.5), dpi= 80

figsize=(12,6) , dpi=100

figsize=( 8,4) , dpi=150

figsize=( 6,3) , dpi=200 

2、Axes

在拥有Figure对象之后,需要添加Axes。也可以理解成为真正可以作画的纸。

添加Axes的方式:

方式一:通过plt的subplot。语法格式:plt.subplot(221)

方式二:通过figure的add_subplot。语法格式:ax1=fig.add_subplot(221)

方式三:通过plt的subplots。subplots返回的值的类型为元组,其中包含两个元素:第一个为一个画布,第二个是子图。这在循环绘图时,额外好用。语法格式:fig,subs=plt.subplots(2,2)

方式四:不规则划分。前面的两个图占了221和222的位置,如果想在下面只放一个图,得把前两个当成一列,即2行1列第2个位置。plt.subplot(212)

3、绘图属性设置

设置pyplot的动态rc参数

  • pyplot使用rc配置文件来自定义图形的各种默认属性,被称为rc配置或rc参数。
  • 在pyplot中几乎所有的默认属性都是可以控制的,例如视图窗口大小以及每英寸点数、线条宽度、颜色和样式、坐标轴、坐标和网格属性、文本、字体等。

查看matplotlib的rc参数:

  1. import matplotlib as plt
  2. print(plt.rc_params())
  1. 常用参数:
  2. Axes:设置坐标轴边界、颜色、坐标
  3. 刻度值大小和网格的显示;
  4. Figure:设置边界颜色、图形大小和子区;
  5. Font:设置字号、字体和样式;
  6. Grid:设置网格颜色和线型;
  7. Legend:设置图例和其中的文本显示;
  8. Lines:设置线条颜色、宽度、线型等;
  9. Savefig:对保存图像进行单独设置;
  10. Xtick和ytick:X、Y轴的主刻度和次刻度设置颜色、大小、方向和标签大小。

4、添加图表标题和坐标轴标题

- 设置中文标签

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. fig,ax=plt.subplots()
  4. plt.rcParams['font.family']=['SimHei']#用来显示中文标签
  5. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

- 设置图表标题和坐标轴标题

.title(label, fontdict=None, loc='center', pad=None)  #label文本内容;fontdic图表标题的字体字号颜色;loc显示位置;pad图表标题到图表坐标系顶端的距离。

.xlabel/ylabel(label, fontdict=None, labelpad=None)

  1. #添加图表标题
  2. plt.title(label='对比图', fontdict={'family':'KaiTi', 'color':'red', 'size':30}, loc='left')
  3. #添加x轴标题
  4. plt.xlabel('month', fontdict={'family':'SimSun', 'color':'red', 'size':20}, labelpad=20)
  5. #添加y轴标题
  6. plt.ylabel('month', fontdict={'family':'SimSun', 'color':'red', 'size':20}, labelpad=20)

5、图例说明

plt.legend(loc, fontsize, facecolor, edgecolor, shadow=False)  用于为图表添加图例。需要注意的是应先在所制作的图表中设置label图例名。

plt.legend(loc='upper right', fontsize=20)  #添加图例

6、绘图的注释

绘图时有时需要在图表中加文本注解。这时可以通过text函数在指定的位置(x,y)加入文本注解;

通过annotate()在指定位置实现指向型注释。

- 指向型注释annotate()

- 无指向型注释text()

  1. #添加注释 参数名xy:箭头注释中箭头所在位置,参数名xytext:注释文本所在位置,
  2. #arrowprops在xy和xytext之间绘制箭头, shrink表示注释点与注释文本之间的图标距离
  3. plt.annotate('我是注释', xy=(2,5), xytext=(2, 10),
  4. arrowprops=dict(facecolor='black', shrink=0.01))

  1. for a, b in zip(x,y):
  2. plt.text(a, b, b, fontdict={'family':'KaiTi', 'color':'red', 'size':30}) # 添加数据标签
  3. #zip()是python的内置函数,以可迭代的对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表。语法格式:zip([iterable,…])
  4. #text()是matplotlib模块中的函数,用于设置标签。
  5. Text(x, y, s, fontdict=None) x/y为标签的坐标,s为标签的内容,fontdict为字体设置

7、区间上下限

当绘画完成后,会发现X、Y轴的区间是会自动调整的,并不是跟我们传入的X、Y轴数据中的最值相同。为了调整区间我们使用下面的方式:

  1. ax.set_xlim([xmin, xmax]) #设置X轴的区间
  2. ax.set_ylim([ymin, ymax]) #Y轴区间
  3. ax.axis([xmin, xmax, ymin, ymax]) #X、Y轴区间
  4. ax.set_ylim(bottom=-10) #Y轴下限
  5. ax.set_xlim(right=25) #X轴上限

8、绘图的填充

调用函数fill_between() 实现曲线下面部分的填充:

  1. plt.fill_between(x, y1, y2, facecolor='green', alpha=0.3)
  2. x:第一个参数表示覆盖的区域, x,表示整个x都覆盖
  3. y1:表示覆盖的下限是y1这个曲线。可设为常数0,则在曲线下面部分填充
  4. y2:表示覆盖的上限是y2这个曲线
  5. facecolor:覆盖区域的颜色
  6. alpha:覆盖区域的透明度[0,1],其值越大,表示越不透明

9、设置网格线

plt.grid(b, which, axis, color, linestyly, linewidth)  b为True,显示网格线;which要设置哪种类型的网格线,取值为major、minor、both表示只设置主要网格线、只设置次要网格线、两者都设置;axis要设置哪个轴的网格线,取值为x、y、both; 

10、区间分段

默认情况下,绘图结束之后,Axes 会自动的控制区间的分段。

  1. data = [('apples', 2), ('oranges', 3), ('peaches', 1)]
  2. fruit, value = zip(*data)
  3. fig, (ax1, ax2) = plt.subplots(2)
  4. x = np.arange(len(fruit))
  5. ax1.bar(x, value, align='center', color='gray')
  6. ax2.bar(x, value, align='center', color='gray')
  7. ax2.set(xticks=x, xticklabels=fruit) #设置x轴值的顺序,并修改了显示的信息为文本
  8. #ax.tick_params(axis='y', direction='inout', length=10) #修改 ticks 的方向以及长度
  9. plt.show()

11、布局

当我们绘画多个子图时,就会有一些美观的问题存在,例如子图之间的间隔,子图与画板的外边间距以及子图的内边距,下面说明这个问题: 

  1. fig, axes = plt.subplots(2, 2, figsize=(9, 9))
  2. fig.subplots_adjust(wspace=0.5, hspace=0.3,
  3. left=0.125, right=0.9,
  4. top=0.9, bottom=0.1)
  5. #fig.tight_layout() #自动调整布局,使标题之间不重叠
  6. plt.show()

通过fig.subplots_adjust()我们修改了子图水平之间的间隔wspace=0.5,垂直方向上的间距hspace=0.3,左边距left=0.125 等等,这里数值都是百分比的。以 [0, 1] 为区间,选择left、right、bottom、top 注意 top 和 right 是 0.9 表示上、右边距为百分之10。不确定如果调整的时候,fig.tight_layout()是一个很好的选择。之前说到了内边距,内边距是子图的,也就是 Axes 对象,所以这样使用 ax.margins(x=0.1, y=0.1),当值传入一个值时,表示同时修改水平和垂直方向的内边距。

调整X、Y的区间使他们使用一样的X、Y轴:

fig, (ax1, ax2) = plt.subplots(1, 2, sharex=True, sharey=True)

12、轴相关

改变边界的位置,去掉四周的边框:

  1. fig, ax = plt.subplots()
  2. ax.plot([-2, 2, 3, 4], [-10, 20, 25, 5])
  3. ax.spines['top'].set_visible(False) #顶边界不可见
  4. ax.xaxis.set_ticks_position('bottom') # ticks 的位置为下方,分上下的。
  5. ax.spines['right'].set_visible(False) #右边界不可见
  6. ax.yaxis.set_ticks_position('left')
  7. # "outward"
  8. # 移动左、下边界离 Axes 10 个距离
  9. #ax.spines['bottom'].set_position(('outward', 10))
  10. #ax.spines['left'].set_position(('outward', 10))
  11. # "data"
  12. # 移动左、下边界到 (0, 0) 处相交
  13. ax.spines['bottom'].set_position(('data', 0))
  14. ax.spines['left'].set_position(('data', 0))
  15. # "axes"
  16. # 移动边界,按 Axes 的百分比位置
  17. #ax.spines['bottom'].set_position(('axes', 0.75))
  18. #ax.spines['left'].set_position(('axes', 0.3))
  19. plt.show()

四、基本绘图2D

1、线图

plt.plot()函数

  1. x = np.linspace(0, np.pi)
  2. y_sin = np.sin(x)
  3. y_cos = np.cos(x)
  4. ax1.plot(x, y_sin)
  5. ax2.plot(x, y_sin, 'go--', linewidth=2, markersize=12)
  6. ax3.plot(x, y_cos, color='red', marker='+', linestyle='dashed')

在上面的三个Axes上作画。plot,前面两个参数为x轴、y轴数据。ax2的第三个参数是 MATLAB风格的绘图,对应ax3上的颜色,marker,线型。

通过关键字参数的方式绘图,如下例:

  1. x = np.linspace(0, 10, 200)
  2. data_obj = {'x': x,
  3. 'y1': 2 * x + 1,
  4. 'y2': 3 * x + 1.2,
  5. 'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}
  6. fig, ax = plt.subplots()
  7. #填充两条线之间的颜色
  8. ax.fill_between('x', 'y1', 'y2', color='yellow', data=data_obj)
  9. # Plot the "centerline" with `plot`
  10. ax.plot('x', 'mean', color='black', data=data_obj)
  11. plt.show()

发现上面的作图,在数据部分只传入了字符串,这些字符串对一个这 data_obj 中的关键字,当以这种方式作画时,将会在传入给 data 中寻找对应关键字的数据来绘图。

2、散点图

  1. x = np.arange(10)
  2. y = np.random.randn(10)
  3. plt.scatter(x, y, color='red', marker='+')
  4. plt.show()

3、条形图 

条形图分两种,一种是水平的,一种是垂直的

  1. np.random.seed(1)
  2. x = np.arange(5)
  3. y = np.random.randn(5)
  4. fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))
  5. vert_bars = axes[0].bar(x, y, color='lightblue', align='center')
  6. horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')
  7. #在水平或者垂直方向上画线
  8. axes[0].axhline(0, color='gray', linewidth=2)
  9. axes[1].axvline(0, color='gray', linewidth=2)
  10. plt.show()

条形图还返回了一个Artists 数组,对应着每个条形,例如上图 Artists 数组的大小为5,我们可以通过这些 Artists 对条形图的样式进行更改,如下例:

  1. fig, ax = plt.subplots()
  2. vert_bars = ax.bar(x, y, color='lightblue', align='center')
  3. # We could have also done this with two separate calls to `ax.bar` and numpy boolean indexing.
  4. for bar, height in zip(vert_bars, y):
  5. if height < 0:
  6. bar.set(edgecolor='darkred', color='salmon', linewidth=3)
  7. plt.show()

4、直方图

plt.hist():直方图用于统计数据出现的次数或者频率,有多种参数可以调整,见下例:

  1. np.random.seed(19680801)
  2. n_bins = 10
  3. x = np.random.randn(1000, 3)
  4. fig, axes = plt.subplots(nrows=2, ncols=2)
  5. ax0, ax1, ax2, ax3 = axes.flatten() #将ax由n*m的Axes组展平成1*nm的Axes组,从而可以直接使用ax[i]来循环
  6. colors = ['red', 'tan', 'lime']
  7. ax0.hist(x, n_bins, density=True, histtype='bar', color=colors, label=colors)
  8. ax0.legend(prop={'size': 10})
  9. ax0.set_title('bars with legend')
  10. ax1.hist(x, n_bins, density=True, histtype='barstacked')
  11. ax1.set_title('stacked bar')
  12. ax2.hist(x, histtype='barstacked', rwidth=0.9)
  13. ax3.hist(x[:, 0], rwidth=0.9)
  14. ax3.set_title('different sample sizes')
  15. fig.tight_layout()
  16. plt.show()

参数中density控制Y轴是概率还是数量,与返回的第一个的变量对应。histtype控制着直方图的样式,默认是 ‘bar’,对于多个条形时就相邻的方式呈现如子图1, ‘barstacked’ 就是叠在一起,如子图2、3。 rwidth 控制着宽度,这样可以空出一些间隙,比较图2、3. 图4是只有一条数据时。

5、饼图

plt.pie(x, explode, labels, colors, autopct, pctdistance, shadow, labeldistance, startangle, radius, counterclock, center, frame)

x饼图块的数据系列值;explode一个列表,指定每一个饼图块与圆心的距离;labels每一个饼图块的数据标签内容;colors每一个饼图块的填充颜色;autopct每个饼图块百分比数值的格式;pctdistance百分比数值与饼图块中心的距离;startangle数据的第一值对应的饼图块在饼图中的初始角度;radius饼图的半径;counterclock是否让饼图逆时针显示;center饼图的中心位置;frame是否显示饼图背后的图框

在plt.pie()函数适当设置参数wedgeprops的值,就能制作圆环图。

plt.pie(y, labels=x, autopct='%.2f%%',pctdistance=0.85, radius=1.0, labeldistance=1.1, wedgeprops={'width':0.3, 'linewidth':2, 'edgecolor':'white'})

6、箱型图

plt.boxplot(data,vert=False) #vert控制方向,默认True,垂直方向。False,水平方向。

7、气泡图

散点图的一种,加入了第三个值 s 可以理解成普通散点,画的是二维,泡泡图体现了Z的大小。 

  1. np.random.seed(19680801)
  2. N = 50
  3. x = np.random.rand(N)
  4. y = np.random.rand(N)
  5. colors = np.random.rand(N)
  6. area = (30 * np.random.rand(N))**2 # 0 to 15 point radii
  7. plt.scatter(x, y, s=area, c=colors, alpha=0.5)
  8. plt.show()

8、等高线(轮廓图)

有时候需要描绘边界的时候,就会用到轮廓图,机器学习用的决策边界也常用轮廓图来绘画,见下例:

  1. fig, (ax1, ax2) = plt.subplots(2)
  2. x = np.arange(-5, 5, 0.1)
  3. y = np.arange(-5, 5, 0.1)
  4. xx, yy = np.meshgrid(x, y, sparse=True)
  5. z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
  6. ax1.contourf(x, y, z)
  7. ax2.contour(x, y, z)

上面画了两个一样的轮廓图,contourf会填充轮廓线之间的颜色。数据x, y, z通常是具有相同 shape 的二维矩阵。x, y 可以为一维向量,但是必需有 z.shape = (y.n, x.n) ,这里 y.n 和 x.n 分别表示x、y的长度。Z通常表示的是距离X-Y平面的距离,传入X、Y则是控制了绘制等高线的范围。

9、制作组合图表

在制作组合图表时,只需要为图表设置两组x坐标或两组y坐标,然后制作两个图表即可。 

  1. plt.bar(x, y1, label='num')
  2. plt.legend(loc='upper left', fontsize=20)  #添加图例
  3. plt.twinx()  #为图表设置双坐标轴
  4. plt.bar(x, y2, label='%')
  5. plt.legend(loc='upper right', fontsize=20)  #添加图例

参考文章:

Python--Matplotlib(基本用法)

python如何使用Matplotlib画图(基础篇)

【Python数据分析与可视化】期末复习笔记整理(不挂科)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/470468
推荐阅读
相关标签
  

闽ICP备14008679号