Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)

  • 本文来自《Python数据分析从入门到精通》_明日科技编著
  • 相信本章内容会引起很多人的兴趣,可视化数据分析图表让您无时无刻不受到视觉的冲击,更会让你有成就感。
  • 在数据分析与机器学习中,我们经常用到大量的可视化操作。一张精美的图表,不仅能展示大量的信息,更能够直观地体现数据之间隐藏的关系。
  • 本章详细介绍了Maplotlib,每一个知识点都结合示例,力求通过可视化效果了解图表的相关功能,并且通过综合应用将图表应用于实际的数据统计分析工作中。

5.1 数据分析图表的作用

  • 通过前面章节的学习,我们学会了基本的数据处理及统计分析。但也出现了这样一个问题,一堆堆数字看起来不是很直观,而且在数据较多的情况下无法展示,不能很好地诠释统计分析结果。举个简单的例子,如图5.1和图5.2所示。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第1张图片
  • 上述举例同是“月销量分析”结果的呈现,您更青睐哪一种?显然,数据分析图表(见5.2)更加直观、生动和具体,它将复杂的统计数字变得简单化、通俗化、形象化,使人一目了然,便于理解和比较。数据分析图表直观地展示统计信息,使我们能够快速了解数据变化趋势、数据比较结果以及所占比例,它对数据分析、数据挖掘起到了关键性的作用。

5.2 如何选择适合的图表类型

  • 数据分析图表的类型包括条形图、柱状图、折线图、饼图、散点图、面积图、环形图、雷达图等。此外,通过图表的相互叠加还可以生成复合型图表。
  • 不同类型的图表适用于不同的场景,可以按使用目的选择合适的图标类型。下面同通过一张框架图来说明,如图5.3所示。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第2张图片

5.3 图表的基本组成

  • 数据分析图表有很多种,但每一种图表的绝大组成部分是基本相同的,一张完整的图表一般包括画布、图表标题、绘图区、数据系列、坐标轴、坐标轴标题、图例、文本标签、网格线等,如图5.4所示。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第3张图片
  • 下面详细介绍各个组成部分的功能。
  • (1)画布:图中最大的白色区域,作为其他图表元素的容器。
  • (2)图表标题:用来概况图表内容的文字,常用的功能有设置字体、字号及字体颜色等。
  • (3)绘图区:画布中的一部分,即显示图形的矩形区域,可改变填充颜色、位置,以便图表展示更好的图形效果。
  • (4)数据系列:在数据区域中,同一列(或同一行)数值数据的集合构成一组数据系列,也就是图表中相关数据点的结合。图表中可以有一组到多组数据系列,多组数据系列之间通常采用不同的图案、颜色或符号来区分。图5.4中,销售额就是数据系列。
  • (5)坐标轴及坐标轴标题:坐标轴是标识数值大小及分类的垂直线和水平线,上面有标定数据值的标志(刻度)。一般情况下,水平轴(x轴)表示数据的分类;坐标轴标题用来说明坐标轴的分类及内容,分为水平坐标轴和垂直坐标轴。图5.4中,x轴的标题是“年份”,y轴的标题是“线上销售额(元)”。
  • (6)图例:是指示图表中系列区域的符号、颜色或形状定义数据系列所代表的内容。图例由两部分构成,即图例标示和图例项。其中,图例标示,代表数据系列的图案,即不同颜色的小方块;图例项,与图例标示对应的数据系列名称。一种图例标示只能对应一种图例项。
  • (7)文本标签:用于为数据系列添加文字说明。
  • (8)网格线:贯穿绘图区的线条,类似标尺可以衡量数据系列数值的标准。常用的功能有设置网格线宽度、样式、颜色、坐标轴等。

5.4 Matplotlib概述

  • 众所周知,Python绘图库有很多,各有特点,而Matplotlib是最基础的Python可视化库。学习Python数据可视化,应首先从Matplotlib学起,然后再学习其他库作为拓展。

5.4.1 Matplotlib简介

  • Matplotlib是一个Python 2D绘图库,常用于数据可视化。它能够以多种硬拷贝格式和跨平台的交互环境生成一个出版物质量的图形。
  • Matplotlib非常强大,绘制各种各样的图表游刃有余,它将容易的事情变得更容易,困难的事情变得可能。只需几行代码就可以绘制折线图(见图5.5和图5.6)、柱形图(见图5.7)、直方图(见图5.8)、饼形图(见图5.9)、散点图(见图5.10)等。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第4张图片
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第5张图片
  • Matplotlib不仅可以绘制以上最基本最基础的图表,还可以绘制一些高级图表,如双y轴可视化数据分析图表(见5.11)、渐变饼形图(见5.13)、等高线图(见5.14)。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第6张图片
  • 不仅如此,Matplotlib还可以绘制3D图表。例如,三维柱形图(见5.15)、三维曲面图(见5.16)。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第7张图片
  • 综上所述,只要熟练地掌握Matplotlib的函数,以及各项参数就能够绘制出各种出乎意料的图表,满足数据分析的需求。

5.4.2 安装Matplotlib

5.4.3 Matplotlib图表之初体验

  • 创建Matplotlib图表简单的只需两步。下面将绘制第一张图表。
  • (1)引入pyplot模块。
  • (2)使用Matplotlib模块的plot()方法绘制图表。
  • (3)输出结果,如下图所示
import matplotlib.pyplot as plt
#折线图
plt.plot([1, 2, 3, 4,5])

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第8张图片

import matplotlib.pyplot as plt
#散点图
plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第9张图片

5.5 图表的常用设置

  • 本节主要介绍图表的常用设置,主要包括颜色设置、线条设置、线条样式、标记样式、设置画布、坐标轴、添加文本标签、设置标题和图例、添加注释文本、调整图表与画布边缘间距,以及其他相关设置等。

5.5.1 基本绘图plot()函数

  • Matplotlib基本绘图主要使用plot()函数,语法如下:
matplotlib.pyplot.plot(x,y,format_string,**kwargs)
  • x:x轴数据
  • y:y轴数据
  • format_string:控制曲线格式的字符串,包括颜色、线条样式和标记样式。
  • **kwargs:键值参数,相当于一个字典,比如输入参数为(1,2,3,4,k,a=1,b=2,c=3),*args=(1,2,3,4,k),**kwargs={‘a’:1,‘b’:2,‘c’:3}

绘制简单折线图

  • 绘制简单折线图,程序代码如下:
import matplotlib.pyplot as plt
#折线图
#range()函数创建整数列表
x = range(1,15,1)
y=range(1,42,3)
plt.plot(x,y)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第10张图片

绘制体温折线图

  • 上一个示例中数据是通过range()函数随机创建的。下面导入Excel体温表,分析下14天基础体温情况,程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x =df['日期']                #x轴数据
y=df['体温']                 #y轴数据
plt.plot(x,y)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第11张图片

  • 至此,您可能还是觉得图5.22中的图表不够完美,那么在接下来的学习中,我们将一步一步完善这张图表。下面介绍表中线条颜色、线条样式和标记样式的设置。

1.颜色设置

  • color参数可以设置线条颜色,通用颜色值如表5.1所示。
  • 表5.1 通用颜色
设置值 说明 设置值 说明
b 蓝色 m 洋红色、
g 绿色 y 黄色
r 红色 k 黑色
c 蓝绿色 w 白色
#FFF00 黄色,十六进制颜色值 0.5 灰度值字符串
  • 其他颜色可以通过十六进制指定,或者指定颜色名称,例如
  • 浮点形式的RGB或RGBA元组,例如(0.1,0.2,0.5)或(0.1,0.2,0.5,0.3)
  • 十六进制的RGB或RGBA字符串,例如#0F0F0F或#0F0F0F0F
  • 0~1的小数作为灰度值,例如0.5
  • {‘b’,‘g’,‘r’,‘c’,‘m’,‘y’,‘k’,‘w’},其中的一个颜色值。
  • X11/CSS4规定中的颜色名称。
  • Xkcd中指定的颜色名称,例如xkcd:sky blue
  • Tableau调色板中的颜色,例如{‘tab:blue’,‘tab:orange’,‘tab:green’,‘tab:red’,‘tab:purple’,‘tab:brown’,‘tab:pink’,‘tab:gray’,‘tab:olive’,‘tab:cyan’}。
  • CN格式的颜色循环,对应的颜色设置代码如下:
from cycler import cycler
colors = ['#1f77b4','#ff7f0e','#2ca02c','#d62728','#9467bd','#8c564b','#e377c2','#7f7f7f','#bcbd22','#17becf']
plt.rcParams['axes.prop_cycle'] = cycler(color=colors)

2.线条格式

  • linestyle可选参数可以设置线条的样式,设置值如下,设置后的效果如图5.23所示。
  • “_”:实线,默认值
  • “–”:双画线
  • “-.”:点画线
  • “:”:虚线
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第12张图片

3.标记样式

  • marker可选参数可以设置标记样式,设置值如表5.2所示。
  • 表5.2 标记设置
标记 说明 标记 说明 标记 说明
. 点标记 1 下花三角标记 h 竖六边形标记
, 像素标记 2 上花三角标记 H 横六边形标记
o 实心圆标记 3 左花三角标记 + 加号标记
v 倒三角标记 4 右花三角标记 x 叉号标记
^ 上三角标记 s 实心正方形标记 D 大棱形标记
> 右三角标记 p 实心五角星标记 d 小棱形标记
< 左三角标记 * 星号标记 | 垂直线标记
  • 下面为“14天基础体温曲线图”设置颜色和样式,并在实际体温位置进行标记,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x =df['日期']                #x轴数据
y=df['体温']                 #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w') #mfc是marker的颜色

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第13张图片

5.5.2 设置画布

  • 画布就像我们画画的画板一样,在Matplotlib中可以使用figure()方法设置画布大小、分辨率、颜色和边框等,语法如下:
matplotlib.pyplot.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
  • num:图像编号或名称,数字为编号,字符串为名称,可以通过该参数激活不同的画布。
  • figsize:指定画布的宽和高,单位为英寸
  • dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为80。像素越大画布越大。
  • facecolor:背景颜色
  • edgecolor:边框颜色
  • frameon:是否显示边框,默认值为True,绘制边框;如果为False,则不绘制边框。

自定义画布

  • 自定义一个5x3的黄色画布,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(5,3),facecolor='yellow')
#导入Excel文件
df=pd.read_excel('体温.xls')
#折线图
x=df['日期']          #x轴数据
y=df['体温']          #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第14张图片

figsize=(5,3),因为实际画布大小是500x300,所以这里不要输入太大的数字。

5.5.3 设置坐标轴

  • 一张精确的图表,其中不免要用到坐标轴,下面介绍Matplotlib中坐标轴的使用。

1.x轴、y轴标题(06)

  • 设置x轴标题和y轴标题主要使用xlabel()函数和ylabel()函数。
  • 设置x轴标题为"2020年2月",y轴标题为“基础体温”,程序代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第15张图片

在本示例中,应注意两个问题,即中文乱码问题和符号不显示问题。它们在实际编程过程中经常出现。

plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.rcParams['axes.unicode_minus']=False #解决负号不显示问题

2. 坐标轴刻度

  • 用matplotlib画二维图像时,默认情况下的横坐标(x轴)和纵坐标(y轴)显示的值有时可能达不到我们的需求,需要借助xticks()函数和yticks()函数分别对x轴和y轴的值进行设置。
xticks(locs,[labels],**kwargs)
  • locs:数组,表示x轴上的刻度。例如,在“学生英语成绩分布图”中,x轴的刻度是2~14的偶数,如果想改变这个值,就可以通过locs参数设置。
  • labels:也是数组,默认值和locs相同。locs表示位置,而labels则决定该位置上的标签,如果赋予labels空值,则x轴将只有刻度而不显示任何值。
为折线图设置刻度1(07)
  • 在“14天基础体温折线图”中,x轴是从2~14的偶数,但实际日期是从1-14的连续数字,下面使用xticks()函数来解决这个问题,将x轴的刻度设置为1-14的连续数字,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题
#设置x轴刻度
plt.xticks(range(1,15,1))

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第16张图片

为折线图设置刻度2(08)
  • 在示例07中,日期看起来 不是很直观。下面将x轴刻度标签直接改为日,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第17张图片

  • 接下来,设置y轴刻度,主要使用yticks()函数。例如,设置体温为35.4~38,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)

# 使用round函数和列表生成式,生成35.438.0间距为0.2的y轴刻度
list = [round(35.4+i*0.2,1) for i in range(14)] #round这里是保留1为小数
plt.yticks(list)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第18张图片

3. 坐标轴范围

  • 坐标轴范围是指x轴和y轴的取值范围。设置坐标轴范围主要使用xlim()函数和ylim()函数。
为折线图设置坐标范围(09)
  • 设置x轴(日期)范围为1~14,y轴(基础体温)范围35-45,主要代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
#坐标轴范围
plt.xlim(1,14)
plt.ylim(35,45)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第19张图片

4.网格线

  • 细节决定成败。很多时候为了图表的美观,不得不考虑细节。下面介绍图表细节之一——网格线,主要使用grid()函数,首先生成网格线,代码如下:
plt.grid()
  • grid()函数也有很多参数,如颜色、网格线的方向(参数axis='x’隐藏x轴网格线,axis='y’隐藏y轴网格线)、网格线样式和网格线宽度等。下面为图表设置网格线,主要代码如下:
plt.grid(color='0.5',linestyle='--',linewidth=1)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)

list = [round(35.4+i*0.2,1) for i in range(14)] #round这里是保留1为小数
plt.yticks(list)
# 设置网格线样式
plt.grid(color='0.5',linestyle='--',linewidth=1)
  • 运行程序,如下图所示:
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第20张图片

网格线对于饼形图来说,直接使用并不显示,需要与饼形图的frame参数配合使用,设置该参数值为True。详见饼形图。

5.5.4 添加文本标签

  • 绘图过程中,为了能够更清晰、直观地看到数据,有时需要给图表中指定的数据点添加文本标签。下面介绍细节之二——文本标签,主要使用text()函数,语法如下:
matplotlib.pyplot.text(x,y,s,fontdict=None,withdash=False,**kwargs)
  • x:x坐标轴的值
  • y:y坐标轴的值
  • s:字符串,注释内容
  • fontdict:字典,可选参数,默认值为None。用于重写默认文本属性。
  • withdash:布尔型,默认值为False,创建一个TexWithDash实例,而不是Text实例。
  • **kwargs:关键字参数。这里指通用的绘图参数,如字体大小fontsize=12、垂直对齐方式horizontalalignment=‘center’(或简写为ha=‘center’)、水平对齐方式verticalalignment=‘center’(或简写为va=‘center’)

为折线图添加基础体温文本标签(10)

  • 为图表中各个数据点添加文本标签,关键代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
            37,37.2,37.4,37.6,37.8,38])

# 为图表中各个数据点添加文本标签
for a,b in zip(x,y):
    # 这里b+0.1表示在数据呈现在y值上面0.1个单位处,注释内容表示保留1位小数
    plt.text(a,b+0.1,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9) 

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第21张图片

  • 在本示例代码中,首先,x、y是x轴和y轴的值,它代表了折线图在坐标中的位置,通过for循环找到每一个x、y值对应的坐标赋值给a、b,再使用plt.text在对应的数据点上添加文本标签,而for循环也保证了折线图中每一个数据点都有文本标签。其中,a,b+3表示每一个数据点(x值对应y值加0.1)的位置处添加文本标签;%.1f%b是对y值进行的格式化处理,保留小数点1位;ha=‘center’、va='bottom’代表水平对齐、垂直对齐的方式,fontsize则是字体大小。

5.5.5 设置标题和图例

  • 数据是一个图表所要展示的内容,而有了标题和图例则可以帮助我们更好地理解这个图表的含义和想要传达的信息。下面介绍图表细节之三——标题和图例。

1.图表标题

  • 为图表设置标题主要使用title()函数,语法如下:
matplotlib.pyplot.title(label,fontdict=None,loc='center',pad=None,**kwargs)
  • label:字符串,表示图表标题文本
  • fontdict:字典,用来设置标题字体的样式。如{‘fontsize’:20,‘fontweight’:20,‘va’:‘bottom’,‘ha’:‘center’}
  • loc:字符串,表示标题水平位置,参数值为center、left或right,分别表示居中、水平居中和水平居左。
  • pad:浮点型,表示标题离图表顶部的距离,默认值为None
  • **kwargs:关键字参数,可以设置一些其他文本属性
  • 例如,设置图表标题为“14天基础体温曲线图”,主要代码如下:
plt.title('14天基础体温曲线图',fontsize='18')

2.图表图例

  • 为图表设置图例主要使用legend()函数。下面介绍图例相关的设置。
  • (1)自动显示图例
plt.legend()
  • (2)手动添加图例
plt.legend('基础体温')

当手动添加图例时,有时会出现文本显示不全,解决方法是在文本后面加一个逗号(,),主要代码如下:

plt.legend(('基础体温',))
  • (3)设置图例显示位置
  • 通过loc参数可以设置图例的显示位置,如在右上方显示,主要代码如下:
plt.legend(('基础体温',),loc='upper right',fontsize=10)
  • 具体图例显示位置的设置如表5.3所示。
  • 表5.3 图例位置参数设置值
位置(字符串) 描述 位置(字符串) 描述
best 自适应 center left 左侧中间位置
upper right 右上方 center right 右侧中间位置
lower left 左下方 lower center 下方中间位置
lower right 右下方 center 正中央
right 右侧
  • 上述参数可以设置大概的图例位置,如果这样可以满足需求,那么第二个参数不设置也可以。第二个参数bbox_to_anchor是元组类型,包括两个值:num1用于控制legend的左右移动,值越大越向右边移动;num2用于控制legend的上下移动,值越大,越向下移动。这两个值用于微调图例的位置。
  • 另外,通过该参数还可以设置图例位于图表外面,主要代码如下:
plt.legend(bbox_to_anchor=(1.05,1),loc=2,borderaxespad=0)
  • 下面来看下设置标题和图例后的“14天基础体温曲线图”,效果如下图:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题

#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
            37,37.2,37.4,37.6,37.8,38])



for a,b in zip(x,y):
    # 这里b+0.1表示在数据呈现在y值上面0.1个单位处,注释内容表示保留1位小数
    plt.text(a,b+0.1,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
# 设置图表标题
plt.title('14天基础体温曲线图',fontsize='18')
# 设置图例
plt.legend(('体温',),loc='upper right',fontsize=10)

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第22张图片

5.5.6 添加注释

  • annotate()函数用于在图表上给数据添加文本注释,而且支持带箭头的画线工具,方便我们在合适的位置添加描述信息。

为图表添加注释(11)

  • 在“14天基础体温折线图”中用箭头指示最高气温,效果如图所示:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls')               #导入Excel文件
#折线图
x=df['日期']                  #x轴数据
y=df['体温']                  #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月')        #x轴标题
plt.ylabel('基础体温')         #y轴标题
#图表标题
plt.title('14天基础体温曲线图',fontsize='18')
#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
       '6日','7日','8日','9日','10日',
       '11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
            37,37.2,37.4,37.6,37.8,38])
for a,b in zip(x,y):
    plt.text(a,b+0.05,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
#图例
plt.legend()
#绘制一个两端缩进的箭头
plt.annotate('最高体温', xy=(9,37.1), xytext=(10.5,37.1),
            xycoords='data',
            arrowprops=dict(facecolor='r', shrink=0.05))

Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第23张图片

  • xy:被注释文本的坐标点,二维元组,如(x,y)
  • xytext:注释文本的坐标点(也就是本示例中箭头的位置),也是二维元组,默认与xy相同。
  • xycoords:是被注释点的坐标系属性,设置值如表5.4所示。
  • 表5.4 xycoords参数设置值
设置值 说明
figure points 以绘图区左下角为参考,单位是点数
figure pixels 以绘图区左下角为参考,单位是像素数
figure fraction 以绘图区左下角为参考,单位是百分比
axes points 以子绘图区左下角为参考,单位是点数(一个figure可以有多个axes,默认为1个)
axes pixels 以子绘图区左下角为参考,单位是像素数
axes fraction 以子绘图区左下角为参考,单位是百分比
data 以被注释的坐标点xy为参考(默认值)
polar 不使用本地数据坐标系,使用极坐标系
  • arrowprops:箭头的样式,dict(字典)型数据。如果该属性非空,则会在注释文本和被注释点之间画一个箭头。arrowprops参数设置值如表5.5所示。
  • 表5.5 arrowprops参数设置值
设置值 说明
width 箭头的宽度(单位是点)
headwidth 箭头头部的宽度(点)
shrink 箭头两端收缩的百分比(占总长)
任何matplotlib.patches.FancyArrowPatch中的关键字

关于annotate()函数的内容还有很多,这里不再赘述,感兴趣的读者可以以上述举例为基础,尝试更多样式的属性和样式。

5.5.7 调整图表与画布边缘间距

  • 很多时候发现绘制出的图表出现显示不全的情况,其原因在于,x轴、y轴标题与画布边缘距离太近,如图5.34所示。
  • 这种情况可以使用subplots_adjust()函数来调整,该函数主要用于调整图表与画布的间距,也可以调整子图表的间距。语法如下:
subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)
  • left、bottom、right和top:这4个参数是用来调整上、下、左、右的空白,如图5.35所示。注意这里是从画布的左下角开始标记,取值为0~1。left和bottom值越小,则空白越少;而right和top值越大,则空白越多。
    Matplotlib可视化数据分析图表上(解决中文乱码、解决负号不显示问题、round函数、为图表中各个数据点添加文本标签、坐标轴范围、添加文本标签、设置标题和图例、添加注释)_第24张图片
  • wspace和hspace:用于调整列间距和行间距。
  • 举个简单的例子,调整图表上、下、左、右的空白,主要代码如下:
plt.subplots_adjust(left=0.2,right=0.9,top=0.9,bottom=0.2)
  • 如果只显示图片,坐标轴及标题都不显示,可以使用如下代码:
plt.subplots_adjust(left=0,bottom=0,right=1,top=1,hspace=0.1,wspace=0.1)

5.5.8 其他设置

1.坐标轴的刻度线

  • (1)设置4个方向的坐标轴上的刻度线是否显示,主要代码如下:
plt.tick_params(bottom=False,left=True,right=True,top=True)
  • (2) 设置x轴和y轴的刻度线显示方向,其中in表示内向,out表示向外,inout表示在中间,默认刻度线向外,主要代码如下:
plt.rcParams['xtick.direction'] = 'in' #x轴的刻度向内显示
plt.rcParams['ytick.direction'] = 'in' #y轴的刻度线向内显示

2.坐标轴相关属性设置

  • axis():返回当前axes范围
  • axis(v):通过输入v=[xmin,xmax,ymin,ymax],设置x、y轴的取值范围
  • axis(‘off’):关闭坐标轴线及坐标轴标签
  • axis(‘equal’):使x、y轴长度一致
  • axis(‘scaled’):调整图框的尺寸(而不是改变坐标轴取值范围),使x、y轴长度一致
  • axis(‘tight’):改变x轴和y轴的限制,使所有数据被展示。如果所有的数据已经显示,它将移动到图形的中心而不修改(xmax~xmin)或(ymax-ymin)
  • axis(‘auto’):自动缩放
  • axis(‘normal’):不推荐使用。恢复默认状态,轴限的自动缩放以使数据显示在图中。

你可能感兴趣的:(利用Python进行数据分析,python自动化,matplotlib,数据分析,python)