Python数据分析-Matplotlib可视化数据分析
1. 图表简介
数据分析图表的类型包括条形图、柱状图、折线图、饼图、散点图、面积图、环形图、雷达图等。此外,通过图表的相互叠加还可以生成复合型图表。
不同类型的图表适用不同的场景,可以按使用目的选择合适的图表类型。
2. 图表分类框架图

3. 图表的基本组成
数据分析图表有很多种,但每一种图表的绝大组成部分是基本相同的,一张完整的图表一般包括画布、图表标题、绘图区、数据系列、坐标轴、坐标轴标题、图例、文本标签、网格线等。 (如下图)

4. Matplotlib概述
Matplotlib是一个Python 2D绘图库,常用于数据可视化。它能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形。
5. 图表的常用设置
主要包括颜色设置、线条样式、标记样式、设置画布、坐标轴、添加文本标签、设置标题和图例、添加注释文本、调整图表与画布边缘间距,以及其他相关设置等。
- 基本绘图plot()函数
- 设置画布
- 设置坐标轴
- 添加文本标签
- 设置标题和图例
- 添加注释
- 调整图表与画布边缘间距
- 其他设置
5.1. 通用颜色
|
设置值 |
说明 |
设置值 |
说明 |
|
b |
蓝色 |
m |
洋红色 |
|
g |
绿色 |
y |
黄色 |
|
r |
红色 |
k |
黑色 |
|
c |
蓝绿色 |
w |
白色 |
|
#FFFF00 |
黄色,十六进制颜色值 |
0.5 |
灰度值字符串 |
5.2. 线条样式

5.3. 标记设置
|
标记 |
说明 |
标记 |
说明 |
标记 |
说明 |
|
. |
点标记 |
1 |
下花三角标记 |
h |
竖六边形标记 |
|
, |
像素标记 |
2 |
上花三角标记 |
H |
横六边形标记 |
|
o |
实心圆标记 |
3 |
左花三角标记 |
+ |
加号标记 |
|
v |
倒三角标记 |
4 |
右花三角标记 |
x |
叉号标记 |
|
^ |
上三角标记 |
s |
实心正方形标记 |
D |
大菱形标记 |
|
> |
右三角标记 |
p |
实心五角星标记 |
d |
小菱形标记 |
|
< |
左三角标记 |
* |
星形标记 |
| |
垂直线标记 |
5.4. 设置画布

5.5. 图例位置参数设置值
|
位置(字符串) |
描述 |
位置(字符串) |
描述 |
|
best |
自适应 |
center left |
左侧中间位置 |
|
upper right |
右上方 |
center right |
右侧中间位置 |
|
upper left |
左上方 |
upper center |
上方中间位置 |
|
lower left |
左下方 |
lower center |
下方中间位置 |
|
lower right |
右下方 |
center |
正中央 |
|
right |
右侧 |
5.6. xycoords参数设置值
|
设置值 |
说明 |
|
figure points |
以绘图区左下角为参考,单位是点数 |
|
figure pixels |
以绘图区左下角为参考,单位是像素数 |
|
figure fraction |
以绘图区左下角为参考,单位是百分比 |
|
axes points |
以子绘图区左下角为参考,单位是点数(一个figure可以有多个axes,默认为1个) |
|
axes pixels |
以子绘图区左下角为参考,单位是像素数 |
|
axes fraction |
以子绘图区左下角为参考,单位是百分比 |
|
data |
以被注释的坐标点xy为参考(默认值) |
|
polar |
不使用本地数据坐标系,使用极坐标系 |
5.7. arrowprops参数设置值
|
设置值 |
说明 |
|
width |
箭头的宽度(单位是点) |
|
headwidth |
箭头头部的宽度(点) |
|
headlength |
箭头头部的长度(点) |
|
shrink |
箭头两端收缩的百分比(占总长) |
|
? |
任何matplotlib.patches.FancyArrowPatch中的关键字 |
6. 常用图表的绘制(来自本人课上学习代码)
6.1. 绘制折线图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 plt.rcParams['font.sans-serif']=['SimHei'] # 解决中文乱码 4 df = pd.read_excel('体温.xls') # 导入Excel文件 5 # 折线图 6 x = df['日期'] # x轴数据 7 y = df['体温'] # y轴数据 8 plt.plot(x, y, color='m', linestyle='-', marker='o', mfc='w') 9 plt.xlabel('2020年2月') # x轴标题 10 plt.ylabel('基础体温') # y轴标题 11 # 图表标题 12 plt.title('14天基础体温曲线图', fontsize='18') 13 # 设置x轴刻度及标签 14 dates = ['1日', '2日', '3日', '4日', '5日', '6日', '7日', '8日', '9日', '10日', '11日', '12日', '13日', '14日'] 15 plt.xticks(range(1, 15, 1), dates) 16 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]) 17 for a, b in zip(x, y): 18 plt.text(a, b+0.05, '%.1f' % b, ha='center', va='bottom', fontsize=9) 19 # 图例 20 plt.legend() 21 # 绘制一个两端缩进的箭头 22 plt.annotate('最高体温', xy=(9, 37.1), xytext=(10.5, 37.1), xycoords='data', arrowprops=dict(facecolor='r', shrink=0.05)) 23 plt.show()
运行结果:

6.2. 绘制柱形图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_excel('books.xlsx', sheet_name='Sheet2') 5 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 6 x = df['年份'] 7 y1 = df['京东'] 8 y2 = df['天猫'] 9 y3 = df['自营'] 10 width = 0.25 # 柱子宽度,若显示n个柱子,则width值需小于1/n ,否则柱子会出现重叠 11 # y轴标签 12 plt.ylabel('线上销售额(元)') 13 # 图表标题 14 plt.title('2013-2019年线上图书销售额分析图') 15 plt.bar(x, y1, width=width, color='darkorange') 16 plt.bar(x + width, y2, width=width, color='deepskyblue') 17 plt.bar(x + 2 * width, y3, width=width, color='g') 18 # 设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式 19 for a, b in zip(x, y1): 20 plt.text(a, b, format(b, ','), ha='center', va='bottom', fontsize=8) 21 for a, b in zip(x, y2): 22 plt.text(a + width, b, format(b, ','), ha='center', va='bottom', fontsize=8) 23 for a, b in zip(x, y3): 24 plt.text(a + 2 * width, b, format(b, ','), ha='center', va='bottom', fontsize=8) 25 plt.legend(['京东', '天猫', '自营']) # 图例 26 plt.show()
运行结果:

6.3. 绘制直方图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_excel('grade1.xls') 5 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 6 x = df['得分'] 7 plt.xlabel('分数') 8 plt.ylabel('学生数量') 9 # 显示图标题 10 plt.title("高一数学成绩分布直方图") 11 plt.hist(x, bins=[0, 25, 50, 75, 100, 125, 150], facecolor="blue", edgecolor="black", alpha=0.7) 12 plt.show()
运行结果:

6.4. 绘制饼形图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 plt.rcParams['font.sans-serif'] = ['SimHei'] 5 df1 = pd.read_excel('data2.xls') 6 df2 = pd.read_excel('data2.xls', sheet_name='2月') 7 # 数据集,x1,x2分别对应外环、内环百分比例 8 x1 = df1['销量'] 9 x2 = df2['销量'] 10 # 设置饼状图各个区块的颜色 11 colors = ['red', 'yellow', 'slateblue', 'green', 'magenta', 'cyan', 'darkorange', 'lawngreen', 'pink', 'gold'] 12 # 外环 13 plt.pie(x1, autopct='%.1f%%', radius=1, pctdistance=0.85, colors=colors, 14 wedgeprops=dict(linewidth=2, width=0.3, edgecolor='w')) 15 # 内环 16 plt.pie(x2, autopct='%.1f%%', radius=0.7, pctdistance=0.7, colors=colors, 17 wedgeprops=dict(linewidth=2, width=0.4, edgecolor='w')) 18 # 图例 19 legend_text = df1['地区'] 20 plt.legend(legend_text, title='地区', frameon=False, bbox_to_anchor=(0.2, 0.5)) # 设置图例标题、位置、去掉图例边框 21 plt.axis('equal') # 设置坐标轴比例以显示为圆形 22 plt.title('2020年1月和2月各地区销量占比情况分析') 23 plt.show()
运行结果:

6.5. 绘制散点图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 aa = r'JDdata.xls' 5 bb = r'JDcar.xls' 6 dfaa = pd.DataFrame(pd.read_excel(aa)) 7 dfbb = pd.DataFrame(pd.read_excel(bb)) 8 df1 = dfaa[['业务日期', '金额']] 9 df2 = dfbb[['投放日期', '支出']] 10 # 去除空日期和金额为0的记录 11 df1 = df1[df1['业务日期'].notnull() & df1['金额'] != 0] 12 df2 = df2[df2['投放日期'].notnull() & df2['支出'] != 0] 13 df1['业务日期'] = pd.to_datetime(df1['业务日期']) 14 df2['投放日期'] = pd.to_datetime(df2['投放日期']) 15 dfData = df1.set_index('业务日期', drop=True) 16 dfCar = df2.set_index('投放日期', drop=True) 17 # 按月度统计并显示销售金额 18 dfData_month = dfData.resample('M').sum().to_period('M') 19 # 按月度统计并显示广告费支出金额 20 dfCar_month = dfCar.resample('M').sum().to_period('M') 21 # x为广告费用,y为销售收入 22 x = pd.DataFrame(dfCar_month['支出']) 23 y = pd.DataFrame(dfData_month['金额']) 24 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 25 plt.title('销售收入与广告费散点图') # 图表标题 26 plt.scatter(x, y, color='red') # 真实值散点图 27 plt.show()
运行结果:

6.6. 绘制面积图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_excel('books.xlsx', sheet_name='Sheet2') 5 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 6 x = df['年份'] 7 y1 = df['京东'] 8 y2 = df['天猫'] 9 y3 = df['自营'] 10 # 图表标题 11 plt.title('2013-2019年线上图书销售情况') 12 plt.stackplot(x, y1, y2, y3, colors=['#6d904f', '#fc4f30', '#008fd5']) 13 # 图例 14 plt.legend(['京东', '天猫', '自营'], loc='upper left') 15 plt.show()
运行结果:

6.7. 绘制热力图
代码示例:
1 import pandas as pd 2 import matplotlib.pyplot as plt 3 4 df = pd.read_excel('data1.xls', sheet_name='高二一班') 5 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 6 X = df.loc[:, "语文":"生物"].values 7 name = df['姓名'] 8 plt.imshow(X) 9 plt.xticks(range(0, 6, 1), ['语文', '数学', '英语', '物理', '化学', '生物']) # 设置x轴刻度标签 10 plt.yticks(range(0, 12, 1), name) # 设置y轴刻度标签 11 plt.colorbar() # 显示颜色条 12 plt.title('学生成绩统计热力图') 13 plt.show()
运行结果:

6.8. 绘制箱形图
代码示例:
1 import matplotlib.pyplot as plt 2 import pandas as pd 3 4 df = pd.read_excel('tips.xlsx') 5 plt.boxplot(x=df['总消费'], # 指定绘制箱线图的数据 6 whis=1.5, # 指定1.5倍的四分位差 7 widths=0.3, # 指定箱线图中箱子的宽度为0.3 8 patch_artist=True, # 填充箱子颜色 9 showmeans=True, # 显示均值 10 boxprops={'facecolor': 'RoyalBlue'}, # 指定箱子的填充色为宝蓝色 11 flierprops={'markerfacecolor': 'red', 'markeredgecolor': 'red', 'markersize': 3}, # 指定异常值的填充色、边框色和大小 12 meanprops={'marker': 'h', 'markerfacecolor': 'black', 'markersize': 8}, # 指定均值点的标记符号(六边形)、填充色和大小 13 medianprops={'linestyle': '--', 'color': 'orange'}, # 指定中位数的标记符号(虚线)和颜色 14 labels=['']) # 去除x轴刻度值 15 16 # 计算下四分位数和上四分位 17 Q1 = df['总消费'].quantile(q=0.25) 18 Q3 = df['总消费'].quantile(q=0.75) 19 # 基于1.5倍的四分位差计算上下限对应的值 20 low_limit = Q1 - 1.5 * (Q3 - Q1) 21 up_limit = Q3 + 1.5 * (Q3 - Q1) 22 # 查找异常值 23 val = df['总消费'][(df['总消费'] > up_limit) | (df['总消费'] < low_limit)] 24 print('异常值如下:') 25 print(val) 26 plt.show()
运行结果:

6.9. 绘制3D图表
代码示例:
1 import matplotlib.pyplot as plt 2 import numpy as np 3 from mpl_toolkits.mplot3d import Axes3D 4 5 fig = plt.figure() 6 ax = Axes3D(fig) # 确保这一行在 plt.show() 之前 7 delta = 0.125 8 # 生成代表X轴数据的列表 9 x = np.arange(-4.0, 4.0, delta) 10 # 生成代表Y轴数据的列表 11 y = np.arange(-3.0, 4.0, delta) 12 # 对x、y数据执行网格化 13 X, Y = np.meshgrid(x, y) 14 Z1 = np.exp(-X ** 2 - Y ** 2) 15 Z2 = np.exp(-(X - 1) ** 2 - (Y - 1) ** 2) 16 # 计算Z轴数据(高度数据) 17 Z = (Z1 - Z2) * 2 18 # 绘制3D图形 19 ax.plot_surface(X, Y, Z, 20 rstride=1, # rstride(row)指定行的跨度 21 cstride=1, # cstride(column)指定列的跨度 22 cmap=plt.get_cmap('rainbow')) # 设置颜色映射 23 # 设置Z轴范围 24 ax.set_zlim(-2, 2) 25 plt.show() # 确保这一行在所有绘图操作完成之后调用
运行结果:
本人计算机不支持显示。
6.10. 绘制多个子图表
代码示例1:
1 import matplotlib.pyplot as plt 2 3 # 第1个子图表-折线图 4 plt.subplot(2, 2, 1) 5 plt.plot([1, 2, 3, 4, 5]) 6 # 第2个子图表-散点图 7 plt.subplot(2, 2, 2) 8 plt.plot([1, 2, 3, 4, 5], [2, 5, 8, 12, 18], 'ro') 9 # 第3个子图表-柱形图 10 plt.subplot(2, 1, 2) 11 x = [1, 2, 3, 4, 5, 6] 12 height = [10, 20, 30, 40, 50, 60] 13 plt.bar(x, height) 14 plt.show()
运行结果1:

代码示例2:
1 import matplotlib.pyplot as plt 2 3 figure, axes = plt.subplots(2, 2) 4 axes[0, 0].plot([1, 2, 3, 4, 5]) # 折线图 5 axes[0, 1].plot([1, 2, 3, 4, 5], [2, 5, 8, 12, 18], 'ro') # 散点图 6 # 柱形图 7 x = [1, 2, 3, 4, 5, 6] 8 height = [10, 20, 30, 40, 50, 60] 9 axes[1, 0].bar(x, height) 10 # 饼形图 11 x = [2, 5, 12, 70, 2, 9] 12 axes[1, 1].pie(x, autopct='%1.1f%%') 13 plt.show()
运行结果2:

6.11. 图表的保存
代码示例:
1 import matplotlib.pyplot as plt 2 3 # 创建一个简单的图表 4 x = [1, 2, 3, 4, 5] 5 y = [2, 4, 6, 8, 10] 6 7 plt.plot(x, y) 8 9 # 保存图表到文件 10 plt.savefig('my_plot.png') 11 12 # 显示图表 13 plt.show()
运行结果:

结果将以图片的形式保存到本地。
时间:2024年4月23日

Python数据分析-Matplotlib可视化数据分析
浙公网安备 33010602011771号