Python数据可视化详解
Posted wespten
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据可视化详解相关的知识,希望对你有一定的参考价值。
数据可视化是一种将庞杂抽象的数据转化为直观易懂的图形的数据呈现技术,它能帮助我们快速把握数据的分布和规律,更加轻松地理解和探索信息。在当今这个信息爆炸的时代,数据可视化越来越受重视。
一、Matplotlib模块
Matplotlib是Python中最常用、最著名的数据可视化模块,该模块的子模块pyplot包含大量用于绘制各类图表的函数。
1、绘制基本图表
日常工作中最基本的图表有柱形图、条形图、折线图、饼图等,Matplotlib模块针对这些图表均提供了对应的绘制函数。用于绘制图表的数据可以直接使用提供的代码,也可以通过pandas模块的read_excel()函数从Excel工作簿中导入。
1. 绘制柱形图
代码文件:绘制柱形图.py
柱形图通常用于直观地对比数据,在实际工作中使用频率很高。使用Matplotlib模块中的bar()函数即可绘制柱形图。
演示代码如下:
1 import matplotlib.pyplot as plt
2 x = [1, 2, 3, 4, 5, 6, 7, 8]
3 y = [60, 45, 49, 36, 42, 67, 40, 50]
4 plt.bar(x, y)
5 plt.show()
第1行代码导入Matplotlib模块的子模块pyplot,第2行和第3行代码分别给出图表的x轴和y轴的值,第4行代码使用bar()函数绘制柱形图,第5行代码使用show()函数显示绘制的图表。
代码运行结果如下图所示:
如果想要改变柱形图中每根柱子的宽度和颜色,可以通过设置bar()函数的参数width和color的值来实现。
演示代码如下:
1 plt.bar(x, y, width=0.5, color='r')
参数width用于设置柱子的宽度,其值并不表示一个具体的尺寸,而是表示柱子的宽度在图表中所占的比例,默认值为0.8。如果设置为1,则各个柱子会紧密相连;如果设置为大于1的数,则各个柱子会相互交叠。
参数color用于设置柱子的填充颜色,上述代码中的“r”是“red”的简写,表示将柱子的填充颜色设置为红色。Matplotlib模块支持多种格式定义的颜色,常用的格式有以下几种:
- 用颜色名的英文单词或其简写定义的8种基础颜色,具体见下表;
- 用RGB值的浮点数元组定义的颜色,RGB值通常是用0~255的十进制整数表示的,如(51, 255, 0),将每个元素除以255,得到(0.2, 1.0, 0.0),就是Matplotlib模块可以识别的RGB颜色;
- 用RGB值的十六进制字符串定义的颜色,如'#33FF00',其与(51, 255, 0)是相同的RGB颜色,可自行搜索“十六进制颜色码转换工具”来获取更多颜色。
在上面的代码中,x轴和y轴的值都是数字,如果值中有中文字符,则必须在绘制图表前加上两行代码。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['上海', '成都', '重庆', '深圳', '北京', '长沙', '南京', '青岛']
5 y = [60, 45, 49, 36, 42, 67, 40, 50]
6 plt.bar(x, y, width=0.5, color='r')
7 plt.show()
第4行代码给出的x轴的值为中文字符串,而Matplotlib模块在绘制图表时默认不支持显示中文,因此必须加上第2行和第3行代码。其中,第2行代码通过设置字体为微软雅黑来正常显示中文内容,第3行代码用于解决负号显示为方块的问题。
第2行代码中的“Microsoft YaHei”是微软雅黑字体的英文名称,如果想使用其他中文字体,可参考下面的字体名称中英文对照表。
代码运行结果如下图所示:
2. 绘制条形图
代码文件:绘制条形图.py
条形图也常用于对比数据,它可以看成将柱形图的x轴和y轴调换位置的结果。使用Matplotlib模块中的barh()函数可绘制条形图。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['上海', '成都', '重庆', '深圳', '北京', '长沙', '南京', '青岛']
5 y = [60, 45, 49, 36, 42, 67, 40, 50]
6 plt.barh(x, y, height=0.5, color='r') # 参数height用于设置条形的高度
7 plt.show()
代码运行结果如下图所示:
3. 绘制折线图
代码文件:绘制折线图.py
折线图常用于显示一段时间内的数据趋势。使用Matplotlib模块中的plot()函数可绘制折线图。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.plot(x, y, color='r', linewidth=2, linestyle='dashdot')
7 plt.show()
第6行代码中,参数color用于设置折线的颜色;参数linewidth用于设置折线的粗细(单位为“点”);参数linestyle用于设置折线的线型,可取的值如下表所示。
代码运行结果如下图所示:
通过设置参数marker和markersize可绘制带数据标记的折线图。
演示代码如下:
1 plt.plot(x, y, color='r', linestyle='dashdot', linewidth=2, marker='*', markersize=10)
代码中的marker= '*'表示设置数据标记的样式为五角星,markersize=10表示设置数据标记的大小为10点。
参数marker常用的取值如下表所示:
代码运行结果如下图所示:
4. 绘制面积图
代码文件:绘制面积图.py
面积图实际上是折线图的另一种表现形式,它利用折线与坐标轴围成的图形来表达数据随时间推移的变化趋势。使用Matplotlib模块中的stackplot()函数可绘制面积图。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.stackplot(x, y, color='r')
7 plt.show()
代码运行结果如下图所示:
5. 绘制散点图
代码文件:绘制散点图.py
散点图常用于发现各变量之间的关系。使用Matplotlib模块中的scatter()函数可绘制散点图。演示代码如下:
1 import pandas as pd
2 import matplotlib.pyplot as plt
3 data = pd.read_excel('汽车速度和刹车距离表.xlsx')
4 x = data['汽车速度(km/h)']
5 y = data['刹车距离(m)']
6 plt.scatter(x, y, s=100, marker='o', color='r', edgecolor='k')
7 plt.show()
第3行代码使用read_excel()函数导入工作簿“汽车速度和刹车距离表.xlsx”中的数据,第4行指定x轴的值为工作簿中“汽车速度(km/h)”列的数据,第5行代码指定y轴的值为工作簿中“刹车距离(m)”列的数据。
第6行代码中,参数s用于设置每个点的面积;参数marker用于设置每个点的样式,取值和plot()函数的参数marker相同;参数color和edgecolor分别用于设置每个点的填充颜色和轮廓颜色。
代码运行结果如下图所示:
为便于推断变量之间的相关性,可为散点图添加一条线性趋势线。
演示代码如下:
1 import pandas as pd
2 import matplotlib.pyplot as plt
3 from sklearn import linear_model
4 data = pd.read_excel('汽车速度和刹车距离表.xlsx')
5 x = data['汽车速度(km/h)']
6 y = data['刹车距离(m)']
7 plt.scatter(x, y, s=100, marker='o', color='r', edgecolor='k')
8 model = linear_model.LinearRegression().fit(x.values.reshape(-1, 1), y)
9 pred = model.predict(x.values.reshape(-1, 1))
10 plt.plot(x, pred, color='k', linewidth=3, linestyle='solid')
11 plt.show()
第3行代码导入Scikit-Learn模块;第8行和第9行代码使用Scikit-Learn模块中的函数创建了一个线性回归算法模型,用于根据汽车速度预测对应的刹车距离;第10行代码根据预测结果使用plot()函数绘制了一条线性趋势线。
代码运行结果如下图所示:
6. 绘制饼图和圆环图
代码文件:绘制饼图和圆环图.py
饼图常用于展示各类别数据的占比。使用Matplotlib模块中的pie()函数可绘制饼图。演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['上海', '成都', '重庆', '深圳', '北京', '青岛', '南京']
5 y = [10, 45, 25, 36, 45, 56, 78]
6 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5)
7 plt.show()
第6行代码中,参数labels用于设置每一个饼图块的标签,参数labeldistance用于设置每一个饼图块的标签与中心的距离,参数autopct用于设置百分比数值的格式,参数pctdistance用于设置百分比数值与中心的距离。
代码运行结果如下图所示:
适当设置参数explode的值,可以分离饼图块以突出显示数据。
演示代码如下:
1 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5, explode=[0, 0, 0, 0, 0, 0.3, 0], startangle=90, counterclock=False)
代码中的参数explode用于设置每一个饼图块与圆心的距离,其值通常是一个列表,列表的元素个数与饼图块的数量相同。这里设置为[0, 0, 0, 0, 0, 0.3, 0],第6个元素为0.3,其他元素均为0,表示将第6个饼图块(青岛)分离,其他饼图块的位置不变。
参数startangle用于设置第1个饼图块的初始角度,这里设置为90°。
参数counterclock用于设置各个饼图块是逆时针排列还是顺时针排列,为False时表示顺时针排列,为True时表示逆时针排列。
代码运行结果如下图所示:
适当设置参数wedgeprops的值,还能绘制出圆环图。
演示代码如下:
1 plt.pie(y, labels=x, labeldistance=1.1, autopct='%.2f%%', pctdistance=1.5, wedgeprops='width': 0.3, 'linewidth': 2, 'edgecolor': 'white')
参数wedgeprops用于设置饼图块的属性,其值为一个字典,字典中的元素则是饼图块各个属性的名称和值的键值对。上述代码中的wedgeprops='width': 0.3, 'linewidth': 2, 'edgecolor': 'white'就表示设置饼图块的环宽(圆环的外圆半径减去内圆半径)占外圆半径的比例为0.3,边框粗细为2,边框颜色为白色。将饼图块的环宽占比设置为小于1的数(这里为0.3),就能绘制出圆环图的效果。
代码运行结果如下图所示:
2、图表的绘制和美化技巧
主要介绍一些图表的绘制和美化技巧,包括在一张画布中绘制多个图表,以及为了让图表更美观、更易于理解,为图表添加图表标题、图例、网格线等元素,并设置元素的格式,如网格线的线型和粗细、坐标轴的刻度范围等。
1. 在一张画布中绘制多个图表
代码文件:在一张画布中绘制多个图表.py
Matplotlib模块在绘制图表时,默认先建立一张画布,然后在画布中显示绘制的图表。如果想要在一张画布中绘制多个图表,可以使用subplot()函数将画布划分为几个区域,然后在各个区域中分别绘制不同的图表。
subplot()函数的参数为3个整型数字:第1个数字代表将整张画布划分为几行;第2个数字代表将整张画布划分为几列;第3个数字代表要在第几个区域中绘制图表,区域的编号规则是按照从左到右、从上到下的顺序,从1开始编号。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.subplot(2, 2, 1)
7 plt.pie(y, labels=x, labeldistance=1.1, startangle=90, counterclock=False)
8 plt.subplot(2, 2, 2)
9 plt.bar(x, y, width=0.5, color='r')
10 plt.subplot(2, 2, 3)
11 plt.stackplot(x, y, color='r')
12 plt.subplot(2, 2, 4)
13 plt.plot(x, y, color='r', linestyle='solid', linewidth=2, marker='o', markersize=10)
14 plt.show()
第6行代码将整张画布划分为2行2列,并指定在第1个区域中绘制图表。接着用第7行代码绘制饼图。
第8行代码将整张画布划分为2行2列,并指定在第2个区域中绘制图表。接着用第9行代码绘制柱形图。
第10行代码将整张画布划分为2行2列,并指定在第3个区域中绘制图表。接着用第11行代码绘制面积图。
第12行代码将整张画布划分为2行2列,并指定在第4个区域中绘制图表。接着用第13行代码绘制折线图。
subplot()函数的参数也可以写成一个3位数的整型数字,如223。使用这种形式的参数时,划分画布的行数或列数不能超过10。
代码运行结果如下图所示:
2. 添加图表元素
代码文件:添加图表元素.py
下面来讲解如何为图表添加图表标题、坐标轴标题、图例、数据标签等图表元素。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.bar(x, y, width=0.6, color='r', label='销售额(万元)')
7 plt.title(label='销售额对比图', fontdict='family': 'KaiTi', 'color': 'k', 'size': 30, loc='center')
8 plt.xlabel('月份', fontdict='family': 'SimSun', 'color': 'k', 'size': 20, labelpad=20)
9 plt.ylabel('销售额', fontdict='family': 'SimSun', 'color': 'k', 'size': 20, labelpad=20)
10 plt.legend(loc='upper left', fontsize=15)
11 for a, b in zip(x, y):
12 plt.text(x=a, y=b, s=b, ha='center', va='bottom', fontdict='family': 'KaiTi', 'color': 'k', 'size': 20)
13 plt.show()
第7行代码中的title()函数用于添加图表标题。参数fontdict用于设置图表标题的文本格式,如字体、颜色、字号等;参数loc用于设置图表标题的位置,可取的值如下表所示。
第8行代码中的xlabel()函数用于添加x轴标题,第9行代码中的ylabel()函数用于添加y轴标题。这两个函数的第1个参数为标题的文本内容,参数fontdict用于设置标题的文本格式,参数labelpad用于设置标题与坐标轴的距离。
第10行代码中的legend()函数用于添加图例,图例的内容由相应的绘图函数决定。例如,第6行代码使用bar()函数绘制柱形图,则legend()函数添加的图例图形为矩形色块,图例标签文本为bar()函数的参数label的值。legend()函数的参数loc用于设置图例的位置,取值可以为字符串或整型数字,具体如下表所示。
需要注意的是,'right'的含义实际上与'center right'的含义相同,这个值是为了兼容旧版本的Matplotlib模块而设立的。
第12行代码中的text()函数的功能是在图表坐标系的指定位置添加文本。参数x和y分别表示文本的x坐标和y坐标;参数s表示文本的内容;参数ha是horizontal alignment的简称,表示文本在水平方向的显示位置,有'center'、'right'、'left'三个值可选;参数va是vertical alignment的简称,表示文本在垂直方向的显示位置,有'center'、'top'、'bottom'、'baseline'、'center_baseline'五个值可选。
参数ha和va取不同值时的绘制效果如下图所示(上方为参数ha的效果示意,下方为参数va的效果示意),限于篇幅,这里不做展开讲解,大家简单了解即可。
text()函数每次只能添加一个文本,要给图表的所有数据点添加数据标签,则需配合使用循环。第11行代码使用for语句构造了一个循环,其中的zip()函数用于将列表x和y的元素逐个配对打包成一个个元组,即类似('1月', 50)、('2月', 45)、('3月', 65)……的形式,再通过循环变量a和b分别取出每个元组的元素,在第12代码中传递给text()函数,用于添加数据标签。
代码运行结果如下图所示:
3. 添加并设置网格线
代码文件:添加并设置网格线.py
使用Matplotlib模块中的grid()函数可以为图表添加网格线。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.plot(x, y, color='r', linestyle='solid', linewidth=2)
7 plt.title(label='销售额趋势图', fontdict='family': 'KaiTi', 'color': 'k', 'size': 30, loc='center')
8 plt.xlabel('月份', fontdict='family': 'SimSun', 'color': 'k', 'size': 20, labelpad= 20)
9 plt.ylabel('销售额(万元)', fontdict='family': 'SimSun', 'color': 'k', 'size': 20, labelpad=20)
10 plt.grid(b=True, color='r', linestyle='dotted', linewidth=1)
11 plt.show()
第10行代码中,grid()函数的参数b设置为True,表示显示网格线(默认同时显示x轴和y轴的网格线),参数linestyle和linewidth分别用于设置网格线的线型和粗细。
代码运行结果如下图所示:
如果只想显示x轴或y轴的网格线,可以对grid()函数的参数axis进行设置。该参数的默认值为'both',表示同时设置x轴和y轴的网格线,值为'x'或'y'时分别表示只设置x轴或y轴的网格线。
演示代码如下:
1 plt.grid(b=True, axis='y', color='r', linestyle='dotted', linewidth=1)
代码运行结果如下图所示:
4. 调整坐标轴的刻度范围
代码文件:调整坐标轴的刻度范围.py
使用Matplotlib模块中的xlim()和ylim()函数可以分别调整x轴和y轴的刻度范围。
演示代码如下:
1 import matplotlib.pyplot as plt
2 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
3 plt.rcParams['axes.unicode_minus'] = False
4 x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
5 y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
6 plt.plot(x, y, color='r', linestyle='solid', linewidth=2, label='销售额(万元)')
7 plt.title(label='销售额趋势图', fontdict='family': 'KaiTi', 'color': 'k', 'size': 30, loc='center')
8 plt.legend(loc='upper left', fontsize=15)
9 for a,b in zip(x, y):
10 plt.text(a, b, b, ha='center', va='bottom', fontdict='family': 'KaiTi', 'color': 'k', 'size': 20)
11 plt.ylim(40, 100)
12 plt.show()
第11行代码中使用ylim()函数设置y轴刻度的取值范围为40~100。如果要调整x轴的刻度范围,使用xlim()函数即可。
代码运行结果如下图所示:
技巧:切换坐标轴的显示和隐藏。
使用axis()函数可以切换坐标轴的显示和隐藏。
演示代码如下:
1 plt.axis('on') # 显示坐标轴
2 plt.axis('off') # 隐藏坐标轴
3、绘制高级图表
前面学习了常见图表的绘制方法,以及图表元素的添加和格式设置。接下来将绘制更加高级、专业的图表,如气泡图、雷达图、箱形图等。
1. 绘制气泡图
代码文件:绘制气泡图.py
气泡图是一种展示三个变量之间关系的图表,它其实是在散点图的基础上升级改造而成的,在原有的x坐标和y坐标两个变量的基础上,引入第三个变量,并用气泡的大小表示。因此,绘制气泡图要用到的函数就是绘制散点图的scatter()函数,只是参数的设置上有些区别。
演示代码如下:
1 import matplotlib.pyplot as plt
2 import pandas as pd
3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 data = pd.read_excel('产品销售统计.xlsx')
6 n = data['产品名称']
7 x = data['销售量(件)']
8 y = data['销售额(元)']
9 z = data['毛利率(%)']
10 plt.scatter(x, y, s=z * 300, color='r', marker='o')
11 plt.xlabel('销售量(件)', fontdict='family': 'Microsoft YaHei', 'color': 'k', 'size': 20, labelpad=20)
12 plt.ylabel('销售额(元)', fontdict='family': 'Microsoft YaHei', 'color': 'k', 'size': 20, labelpad=20)
13 plt.title('销售量、销售额与毛利率关系图', fontdict='family': 'Microsoft YaHei', 'color': 'k', 'size': 30, loc='center')
14 for a, b, c in zip(x, y, n):
15 plt.text(x=a, y=b, s=c, ha='center', va='center', fontsize=15, color='w')
16 plt.xlim(50, 600)
17 plt.ylim(2900, 11000)
18 plt.show()
绘制气泡图的关键是设置scatter()函数的参数s的值,该参数表示每个点的面积。当该参数为单个值时,表示所有点的面积相同,从而绘制出散点图;当该参数为一个序列类型的值时,就可以分别为每个点设置不同的面积,从而绘制出气泡图。
第10行代码中将参数s设置为序列类型的变量z,并将序列中的每个值放大300倍,这是因为毛利率的值较小,如果不放大,气泡会太小,导致图表不美观。第16行和第17行代码适当设置x轴和y轴的刻度范围,让气泡显示完全。
代码运行结果如下图所示:
2. 绘制组合图
代码文件:绘制组合图.py
组合图是指在一个坐标系中绘制多张图表,其实现方式也很简单,在使用Matplotlib模块中的函数绘制图表时设置多组y坐标值即可。
演示代码如下:
1 import pandas as pd
2 import matplotlib.pyplot as plt
3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 data = pd.read_excel('销售业绩表.xlsx')
6 x = data['月份']
7 y1 = data['销售额(万元)']
8 y2 = data['同比增长率']
9 plt.bar(x, y1, color='c', label='销售额(万元)')
10 plt.plot(x, y2, color='r', linewidth=3, label='同比增长率')
11 plt.legend(loc='upper left', fontsize=15)
12 plt.show()
第7行和第8行代码分别设置了两组y坐标值,第9行代码用第1组y坐标值绘制了一个柱形图,第10行代码用第2组y坐标值绘制了一个折线图。
代码运行结果如下图所示:
从上图可以看到,因为两组y坐标值的数量级相差比较大,所以绘制出的组合图中,代表同比增长的折线图近乎一条直线,对分析数据完全没有帮助。此时需要使用twinx()函数为图表设置次坐标轴。
演示代码如下(第1~8行与前面相同,从略):
9 plt.bar(x, y1, color='c', label='销售额(万元)')
10 plt.legend(loc='upper left', fontsize=15)
11 plt.twinx()
12 plt.plot(x, y2, color='r', linewidth=3, label='同比增长率')
13 plt.legend(loc='upper right', fontsize=15)
14 plt.show()
第9行代码绘制了一个柱形图,第10行代码在图表左上角为柱形图添加图例;第11行代码使用twinx()函数为图表添加次坐标轴;第12行代码在次坐标轴中绘制了一个折线图,第13行代码在图表右上角为折线图添加图例。
代码运行结果如下图所示:
3. 绘制直方图
代码文件:绘制直方图.py
直方图用于展示数据的分布情况,使用Matplotlib模块中的hist()函数可以绘制直方图。演示代码如下:
1 import pandas as pd
2 import matplotlib.pyplot as plt
3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 data = pd.read_excel('客户年龄统计表.xlsx')
6 x = data['年龄']
7 plt.hist(x, bins=9)
8 plt.xlim(15, 60)
9 plt.ylim(0, 40)
10 plt.title('年龄分布直方图', fontsize=20)
11 plt.xlabel('年龄')
12 plt.ylabel('人数')
13 plt.grid(b=True, linestyle='dotted', linewidth=1)
14 plt.show()
第7行代码中,hist()函数的参数bins用于设置直方图中数据分组的组数,也就是柱子的个数。
代码运行结果如下图所示:
4. 绘制雷达图
代码文件:绘制雷达图.py
雷达图可以同时比较和分析多个指标。该图表可以看成一条或多条闭合的折线,因此,使用绘制折线图的plot()函数也可以绘制雷达图。
演示代码如下:
1 import pandas as pd
2 import numpy as np
3 import matplotlib.pyplot as plt
4 plt.rcParams['font.sans-serif'] = ['SimHei']
5 plt.rcParams['axes.unicode_minus'] = False
6 data = pd.read_excel('汽车性能指标分值统计表.xlsx')
7 data = data.set_index('性能评价指标')
8 data = data.T
9 data.index.name = '品牌'
10 def plot_radar(data, feature):
11 columns = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性', '方便性', '舒适性', '经济性', '容量性']
12 colors = ['r', 'g', 'y']
13 angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(columns), endpoint=False)
14 angles = np.concatenate((angles, [angles[0]]))
15 figure = plt.figure(figsize=(6, 6))
16 ax = figure.add_subplot(1, 1, 1, projection='polar')
17 for i, c in enumerate(feature):
18 stats = data.loc[c]
19 stats = np.concatenate((stats, [stats[0]]))
20 ax.plot(angles, stats, '-', linewidth=2, c=colors[i], label=str(c))
21 ax.fill(angles, stats, color=colors[i], alpha=0.75)
22 ax.legend(loc=4, bbox_to_anchor=(1.15, -0.07))
23 ax.set_yticklabels([2, 4, 6, 8, 10])
24 ax.set_thetagrids(angles * 180 / np.pi, columns, fontsize=12)
25 plt.show()
26 return figure
27 figure = plot_radar(data, ['A品牌', 'B品牌', 'C品牌'])
第10~26行代码自定义了一个函数plot_radar(),该函数有两个参数,其中data是用于绘制图表的数据,feature是要展示的一个或多个品牌。
第11行代码设置了在图表中要展示的性能评价指标。第12行代码用于设置每个品牌在图表中的图例颜色。第13行代码根据要显示的指标个数对圆形进行等分。第14行代码用于连接刻度线数据。第15行代码使用figure()函数创建了一张高和宽都为6英寸的画布。第16行代码使用add_subplot()函数将整张画布划分为1行1列,并在第1个区域中绘图。第17~21行代码使用for语句和plot()函数为指定的各个品牌绘制雷达图。
第22行代码中的loc=4表示图例显示在右下角,参数bbox_to_anchor则用于确定图例在坐标轴方向上的位置。第23行代码用于设置要显示的刻度线数据值。第24行代码用于在图表中添加数据标签。
代码运行结果如下图所示:
如果只想展示单个品牌的指标,将第27行代码改为下面的代码即可。
1 figure = plot_radar(data, ['B品牌'])
代码运行结果如下图所示:
5. 绘制树状图
代码文件: 绘制树状图.py
树状图通过矩形的面积、排列和颜色直观地展示多个项目的数据比例关系。要绘制该图表,需结合使用Matplotlib模块与squarify模块。
演示代码如下:
1 import squarify as sf
2 import matplotlib.pyplot as plt
3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 x = ['上海', '北京', '重庆', '成都', '南京', '青岛', '长沙', '武汉', '深圳']
6 y = [260, 45, 69, 800, 290, 360, 450, 120, 50]
7 colors = ['lightgreen', 'pink', 'yellow', 'skyblue', 'cyan', 'silver', 'lightcoral', 'orange', 'violet']
8 percent = ['11%', '2%', '3%', '33%', '12%', '15%', '18%', '5%', '2%']
9 chart = sf.plot(sizes=y, label=x, color=colors, value=percent, edgecolor='white', linewidth=2)
10 plt.title(label='城市销售额分布及占比图', fontdict='family': 'KaiTi', 'color': 'k', 'size': 25)
11 plt.axis('off')
12 plt.show()
第1行和第2行代码分别导入squarify模块和Matplotlib模块。第5行代码指定图表中每一个矩形的文字标签。第6行代码指定每一个矩形的大小。第7行代码指定每一个矩形的填充颜色。第8行代码指定每一个矩形的数值标签。第9行代码使用squarify模块中的plot()函数绘制树状图。
代码运行结果如下图所示:
6. 绘制箱形图
代码文件:绘制箱形图.py
箱形图是一种用于展示数据的分布情况的统计图,因形状如箱子而得名。使用Matplotlib模块中的boxplot()函数可以绘制箱形图。
演示代码如下:
1 import pandas as pd
2 import matplotlib.pyplot as plt
3 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
4 plt.rcParams['axes.unicode_minus'] = False
5 data = pd.read_excel('1月销售统计表.xlsx')
6 x1 = data['成都']
7 x2 = data['上海']
8 x3 = data['北京']
9 x4 = data['重庆']
10 x5 = data['南京']
11 x = [x1, x2, x3, x4, x5]
12 labels = ['成都', '上海', '北京', '重庆', '南京']
13 plt.boxplot(x, vert=True, widths=0.5, labels=labels, showmeans=True)
14 plt.title('各地区1月销售额箱形图', fontsize=20)
15 plt.ylabel('销售额(万元)')
16 plt.show()
第6~11行代码给出了用于绘制箱形图的数据。第12行代码给出了x坐标值。第13行代码中的参数vert用于设置箱形图的方向,True表示纵向展示,False表示横向展示;参数showmeans用于设置是否显示均值,True表示显示均值,False表示不显示均值。
代码运行结果如下图所示:
箱形图中的5条横线和1个点所代表的含义如下:
- 下限:指所有数据中的最小值;
- 下四分位数:又称“第一四分位数”,指将所有数据从小到大排列后第25%的值;
- 中位数:又称“第二四分位数”,指将所有数据从小到大排列后第50%的值;
- 上四分位数:又称“第三四分位数”,指将所有数据从小到大排列后第75%的值;
- 上限:指所有数据中的最大值;
- 点:指所有数据的平均值。
7. 绘制玫瑰图
代码文件:绘制玫瑰图.py
玫瑰图可反映多个维度的数据,它将柱形图转化为饼图,在圆心角相同的情况下,以扇面长度展示指标大小。要绘制玫瑰图,也要用到绘制柱形图的bar()函数。
演示代码如下:
1 import numpy as np
2 import pandas as pd
3 import matplotlib.pyplot as plt
4 plt.rcParams['font.sans-serif'] = ['SimHei']
5 plt.rcParams['axes.unicode_minus'] = False
6 index = ['0~0.5', '0.6~2.0', '2.1~4.0', '4.1~6.0']
7 columns = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
8 np.random.seed(0)
9 data = pd.DataFrame(np.random.randint(30, 300, (4, 16)), index=index, columns=columns)
10 N = 16
11 theta = np.linspace(0, 2 * np.pi, N, endpoint=False)
12 width = np.pi / N
13 labels = list(data.columns)
14 plt.figure(figsize=(6, 6))
15 ax = plt.subplot(1, 1, 1, projection='polar')
16 for i in data.index:
17 radius = data.loc[i]
18 ax.bar(theta, radius, width=width, bottom=0.0, label=i, tick_label=labels)
19 ax.set_theta_zero_location('N')
20 ax.set_theta_direction(-1)
21 plt.title('各方向风速频数玫瑰图', fontsize=20)
22 plt.legend(loc=4, bbox_to_anchor=(1.3, 0.2))
23 plt.show()
第6行代码将风速的分布设置为4个区间。第7行代码设置了16个方向。第8行代码中的seed()函数用于产生相同的随机数。第9行代码创建一个4行16列的DataFrame,其中的数据是30~300范围内的随机数,行标签为第6行代码设置的风速分布区间,列标签为第7行代码设置的方向。
第10行代码指定风速的方向数量为16。第11行代码用于生成16个方向的角度值。第12行代码用于计算扇面的宽度。第13行代码用于定义坐标轴标签为16个方向的名称。
第14行代码使用figure()函数创建一张高和宽都为6英寸的画布。第15行代码使用subplot()函数将整张画布划分为1行1列,并在第1个区域中绘图。
第18行代码使用bar()函数绘制玫瑰图中的16根柱子,也就是扇面,参数bottom用于设置每根柱子底部的位置,这里设置为0.0,表示从圆心开始绘制。
第19行代码用于设置0°的方向为“N”,即北方。第20行代码用于设置按逆时针方向排列各个柱子。
代码运行结果如下图所示:
二、pyecharts模块
pyecharts是基于ECharts图表库开发的Python第三方模块。ECharts是一个纯javascript的商业级图表库,兼容当前绝大部分浏览器,能够创建类型丰富、精美生动、可交互、可高度个性化定制的数据可视化效果。pyecharts则在Python与ECharts之间搭建起一座桥梁,让Python用户也能使用ECharts的强大功能。
1、图表配置项
代码文件:图表配置项.py
pyecharts模块使用命令“pip install pyecharts”即可安装。使用该模块绘制图表之前,首先要导入该模块,导入语句通常写成“from pyecharts.charts import 图表类型关键词”。导入模块后,给出用于绘制图表的数据,即可绘制图表。
下面以绘制柱形图为例,讲解pyecharts模块的基本用法。
演示代码如下:
1 from pyecharts.charts import Bar
2 x = ['连衣裙', '短裤', '运动套装', '牛仔裤', '针织衫', '半身裙', '衬衫', '阔腿裤', '打底裤']
3 y1 = [36, 56, 60, 78, 90, 20, 50, 70, 10]
4 y2 = [16, 30, 50, 90, 45, 10, 60, 54, 40]
5 chart = Bar()
6 chart.add_xaxis(x)
7 chart.add_yaxis('分店A', y1)
8 chart.add_yaxis('分店B', y2)
9 chart.render('图表配置项.html')
第1行代码导入pyecharts模块中的Bar()函数,该函数用于绘制柱形图。如果要绘制其他类型的图表,在此导入相应的图表函数即可。
第2~4行代码给出图表的x坐标和y坐标的值,其中y坐标值有两个数据系列。
第6行代码中的add_xaxis()函数用于添加x坐标值。第7行和第8行代码中的add_yaxis()函数用于依次添加两个系列的y坐标值,该函数的第1个参数用于设置系列名称,第2个参数用于设置系列数据。
第9行代码中的render()函数用于将绘制的图表保存为一个网页文件,此处保存为代码文件所在文件夹下的“图表配置项.html”文件,保存路径和文件名可以根据实际需求更改。
运行上面的代码后,在代码文件所在文件夹下会生成一个名为“图表配置项.html”的网页文件。双击该文件,可在默认浏览器中看到如下图所示的柱形图。
该柱形图是静态的,并且没有图表标题、坐标轴标题等元素。如果想要绘制个性化的动态图表,可对图表元素进行配置。在pyecharts模块中,图表的一切元素皆可配置,用于配置图表元素的选项称为配置项。配置项分为全局配置项和系列配置项两种,这里主要介绍全局配置项。
全局配置项可通过pyecharts模块中的set_global_opts()函数进行设置。使用该函数设置全局配置项时,要先导入pyecharts模块的options子模块。
全局配置项有很多内容,每个配置项对应options子模块中的一个函数。
常见图表元素对应的配置项函数如下表所示:
每个配置项对应的函数有很多参数,下面以图例的配置项对应的LegendOpts()函数为例,简单介绍配置项函数的参数,具体见下表。
如果想了解更多配置项的知识,可以查阅pyecharts模块的官方文档,网址为https://pyecharts.org/#/zh-cn/global_options。
下面通过设置全局配置项,为前面绘制的柱形图添加图表标题、缩放滑块、坐标轴标题等元素。
演示代码如下:
1 from pyecharts import options as opts
2 chart.set_global_opts(title_opts=opts.TitleOpts(title='产品销售额对比图', pos_left='left'),
3 yaxis_opts=opts.AxisOpts(name='销售业绩(元)', name_location='end'),
4 xaxis_opts=opts.AxisOpts(name='产品', name_location='end'),
5 tooltip_opts=opts.TooltipOpts(is_show=True, formatter='a<br/>b:c', background_color='black', border_width=15),
6 legend_opts=opts.LegendOpts(is_show=False),
7 toolbox_opts=opts.ToolboxOpts(is_show=True, orient='horizontal'),
8 visualmap_opts=opts.VisualMapOpts(is_show=True, type_='color', min_=0, max_=100, orient='vertical'),
9 datazoom_opts=opts.DataZoomOpts(is_show=True, type_='slider'))
在上面的代码中,配置项TitleOpts()函数为图表添加了图表标题,并设置图表标题位于左侧。
配置项AxisOpts()函数为图表分别添加了y轴标题“销售业绩(元)”和x轴标题“产品”,并设置坐标轴标题位于轴的尾部。
配置项TooltipOpts()函数设置了图表的提示框,也就是将鼠标指针放在图表的数据系列上时弹出的提示信息。
配置项LegendOpts()函数设置了不显示图例。
配置项ToolboxOpts()函数设置了工具箱以横向布局显示在图表中。
配置项VisualMapOpts()函数设置了开启视觉映射,并设置了视觉映射的颜色、最小值、最大值及布局方式。
配置项DataZoomOpts()函数设置了开启区域缩放功能,并设置其类型为滑块。
运行代码后,打开生成的网页文件,可看到如下图所示的柱形图。拖动下方的缩放滑块,可动态展示部分产品的销售额对比情况。
pyecharts模块还内置了多种风格的图表主题,让用户可以更轻松地设置图表的外观。使用方法是先导入pyecharts模块中的ThemeType对象,然后在图表的函数中使用InitOpts()函数设置初始化配置项。
演示代码如下:
1 from pyecharts.globals import ThemeType
2 chart = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
第2行代码在Bar()函数中使用InitOpts()函数设置图表的主题风格为“DARK”,还可以设置为“LIGHT”“CHALK”“ESSOS”等。
设置主题后的图表效果如下图所示:
2、绘制漏斗图
代码文件:绘制漏斗图.py
漏斗图用于呈现从上到下的几个阶段的数据,各阶段的数据逐渐变小。使用pyecharts模块中的Funnel()函数可以快速绘制漏斗图。下面用该函数绘制一个漏斗图,展示电商网站上从浏览商品到完成交易各阶段人数的变化。
演示代码如下:
1 import pyecharts.options as opts
2 from pyecharts.charts import Funnel
3 x = ['浏览商品', '放入购物车', '生成订单', '支付订单', '完成交易']
4 y = [1000, 900, 400, 360, 320]
5 data = [i for i in zip(x, y)]
6 chart = Funnel()
7 chart.add(series_name='人数', data_pair=data, label_opts=opts.LabelOpts(is_show=True, position='inside'), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='a:c'))
8 chart.set_global_opts(title_opts=opts.TitleOpts(title='电商网站流量转化漏斗图', pos_left='center'), legend_opts=opts.LegendOpts(is_show=False))
9 chart.render('漏斗图.html')
第5行代码先用zip()函数将列表x和y中对应的元素配对打包成一个个元组,然后将这些元组组成一个列表。这一操作必不可少,因为Funnel()函数要求图表的数据格式必须是由元组组成的列表,即[(key1, value1), (key2, value2), (……)]的格式。
技巧:列表推导式。
第5行代码使用的生成列表的语法格式称为列表推导式,它等同于如下代码:
1 data = []
2 for i in zip(x, y)
3 data.append(i)
列表推导式能让代码变得简明扼要,它同样适用于字典、集合等可迭代的数据结构。
第7行代码中,add()函数的各个参数的作用如下:
- 参数series_name用于指定系列名称。
- 参数data_pair用于指定系列数据值。
- 参数label_opts用于设置标签,标签的配置项又有多个参数:参数is_show用于控制是否显示标签,为True时表示显示,为False时表示不显示;参数position用于设置标签的位置,这里设置为'inside',表示标签显示在图表内部,该参数的值还可以为'top'、'left'、'right'等。
- 参数tooltip_opts用于设置提示框,提示框的配置项又有多个参数:参数trigger用于设置提示框的触发类型,其值一般设置为'item',表示当鼠标指针放置在数据系列上时就显示提示框;参数formatter用于设置提示框的显示内容,这里的a代表系列名称,c代表数据值。
运行代码后,得到的图表效果如下图所示:
如果想要让漏斗图倒立,可在add()函数中使用参数sort_调整数据图形的排列方向。此外,还可以在add()函数中使用参数gap设置数据图形的间距。
演示代码如下:
1 chart.add(series_name='人数', data_pair=data, sort_='ascending', gap=15, label_opts=opts.LabelOpts(is_show=True, position='inside'), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='a:c'))
运行代码后,得到的图表效果如下图所示。
3、绘制涟漪特效散点图
代码文件:绘制涟漪特效散点图.py
前面介绍过使用Matplotlib模块中的plot()函数绘制散点图的方法,用这种方法绘制的散点图是静态的。使用pyecharts模块中的EffectScatter()函数则能绘制带有涟漪特效的散点图。
演示代码如下:
1 import pandas as pd
2 import pyecharts.options as opts
3 from pyecharts.charts import EffectScatter
4 data = pd.read_excel('客户购买力统计表.xlsx')
5 x = data['年龄'].tolist()
6 y = data['消费金额(元)'].tolist()
7 chart = EffectScatter()
8 chart.add_xaxis(x)
9 chart.add_yaxis(series_name='年龄,消费金额(元)', y_axis=y, label_opts=opts.LabelOpts(is_show=False), symbol_size=15)
10 chart.set_global_opts(title_opts=opts.TitleOpts(title='客户购买力散点图'), yaxis_opts=opts.AxisOpts(type_='value', name='消费金额(元)', name_location='middle', name_gap=40), xaxis_opts=opts.AxisOpts(type_='value', name='年龄', name_location='middle', name_gap=40), tooltip_opts=opts.TooltipOpts(trigger='item', formatter='a:c'))
11 chart.render('涟漪特效散点图.html')
第5行和第6行代码从DataFrame中选取数据后,使用tolist()函数将选取的数据转换为列表格式,这是因为pyecharts模块只支持Python原生的数据类型,包括int、float、str、bool、dict、list。
第9行代码中,add_yaxis()函数的参数label_opts与add()函数的同名参数含义相同,参数symbol_size用于设置标记的大小。
第10行代码中,参数title_opts用于设置图表标题;参数yaxis_opts和xaxis_opts分别用于设置y坐标轴和x坐标轴,对应的配置项函数AxisOpts()的参数type_用于设置坐标轴的类型[这里设置为'value'(数值轴),还可以设置为'category'(类目轴)、'time'(时间轴)、'log'(对数轴)],参数name用于设置坐标轴标题,参数name_location用于设置坐标轴标题相对于轴线的位置(这里设置为居中显示),参数name_gap用于设置坐标轴标题与轴线的间距(这里设置为40 px)。
运行代码后,得到的图表效果如下图所示:
4、绘制水球图
代码文件:绘制水球图.py
水球图适合用于展示单个百分数。使用pyecharts模块中的Liquid()函数可以绘制水球图,通过非常简单的配置就能获得酷炫的展示效果。
演示代码如下:
1 import pyecharts.options as opts
2 from pyecharts.charts import Liquid
3 a = 68
4 t = 100
5 chart = Liquid()
6 chart.add(series_name='商品A', data=[a / t])
7 chart.set_global_opts(title_opts=opts.TitleOpts(title='产品销售业绩达成率', pos_left='center'))
8 chart.render('水球图.html')
第3行和第4行代码分别给出产品的实际销售业绩和目标销售业绩。第6行代码中,add()函数的参数data用于指定系列数据,本案例要展示销售业绩达成率,使用实际销售业绩除以目标销售业绩即可。需要注意的是,参数data的格式必须为一个列表。
运行代码后,得到的图表效果如下图所示:
Liquid()函数绘制的水球图的默认形状为圆形,可以通过设置参数shape的值来改变水球图的形状。该参数的值可以为'circle'、'rect'、'roundRect'、'triangle'、'diamond'、'pin'、'arrow',对应的形状分别为圆形、矩形、圆角矩形、三角形、菱形、地图图钉、箭头。
演示代码如下:
1 chart.add(series_name='商品A', data=[a / t], shape='rect')
运行代码后,得到的图表效果如下图所示:
如果希望在一个水球图中绘制多个水球,可以通过设置add()函数的参数center来实现。
演示代码如下:
1 import pyecharts.options as opts
2 from pyecharts.charts import Liquid
3 a1 = 68
4 a2 = 120
5 a3 = 37
6 t = 100
7 chart = Liquid()
8 chart.set_global_opts(title_opts=opts.TitleOpts(title='产品销售业绩达成率', pos_left='center'))
9 chart.add(series_name='商品A', data=[a1 / t], center=['20%', '50%'])
10 chart.add(series_name='商品B', data=[a2 / t], center=['50%', '50%'])
11 chart.add(series_name='商品C', data=[a3 / t], center=['80%', '50%'])
12 chart.render('水球图.html')
第3~6行代码分别指定了3个产品的实际销售业绩和相同的目标销售业绩。
第7行代码创建了一个水球图。第8行代码为水球图添加了居中显示的图表标题。
第9~11行代码使用add()函数依次在水球图中绘制了3个水球。函数的参数center用于指定水球的中心点在图表中的位置。
运行代码后,得到的图表效果如下图所示:
5、绘制仪表盘
代码文件:绘制仪表盘.py
仪表盘同水球图一样,也适合用于展示单个百分数。使用pyecharts模块中的Gauge()函数可以绘制仪表盘。
演示代码如下:
1 import pyecharts.options as opts
2 from pyecharts.charts import Gauge
3 chart = Gauge()
4 chart.add(series_name='业务指标', data_pair=[('完成率', '62.25')], split_number=10, radius='80%', title_label_opts=opts.LabelOpts(font_size=30, color='red', font_family='Microsoft YaHei'))
5 chart.set_global_opts(legend_opts=opts.LegendOpts(is_show=False), tooltip_opts=opts.TooltipOpts(is_show=True, formatter='a<br/>b:c%'))
6 chart.render('仪表盘.html')
第4行代码中的参数split_number用于指定仪表盘的平均分割段数,这里设置为10段;参数radius用于设置仪表盘的半径,其值可以是百分数或数值;参数title_label_opts用于设置仪表盘内标题文本标签的配置项。
运行代码后,得到的图表效果如下图所示:
6、绘制词云图
代码文件:绘制词云图.py
词云图是一种用于展示高频关键词的图表,它通过文字、颜色、图形的搭配,产生极具冲击力的视觉效果。使用pyecharts模块中的WordCloud()函数可以绘制词云图。
演示代码如下:
1 import pandas as pd
2 import pyecharts.options as opts
3 from pyecharts.charts import WordCloud
4 data = pd.read_excel('电影票房统计.xlsx')
5 name = data['电影名称']
6 value = data['总票房(亿元)']
7 data1 = [z for z in zip(name, value)]
8 chart = WordCloud()
9 chart.add('总票房(亿元)', data_pair=data1, word_size_range=[6, 66])
10 chart.set_global_opts(title_opts=opts.TitleOpts(title='电影票房分析', title_textstyle_opts=opts.TextStyleOpts(font_size=30)), tooltip_opts=opts.TooltipOpts(is_show=True))
11 chart.render('词云图.html')
第9行代码中,add()函数的参数word_size_range用于设置词云图中每个词的字号的变化范围。运行代码后,得到的图表效果如下图所示。
与水球
以上是关于Python数据可视化详解的主要内容,如果未能解决你的问题,请参考以下文章
数据挖掘&机器学习招聘网站的职位招聘数据的分位数图分位数-分位数图以及散点图使用线性回归算法拟合散点图处理详解
Python可视化应用实战案例30篇-基础绘图命令详解含大量示例代码(附Python代码)