(1)
- 学习心得
- 1.Matplotlib图像构成
- 2.绘图基本步骤
- 3.中文字符显示
- 4.坐标轴字符刻度标注
- 5.散点图
- 6.线形图
- 7.柱状图
- 8.直方图
- 9.饼图
- 10.箱线图
- 11.子图
Matplotlib是Python中一个二维绘图包,能够非常简单的实现数据可视化。Matplotlib最早由John Hunter于2002年启动开发,其目的是为了构建一个Matlab式的绘图函数接口。下面详细介绍Matplotlib图像构成、Matplotlib图像基本绘图流程、中文字符显示、坐标轴字符刻度标注等基本绘图知识。
为了方便快速绘图,Matplotlib通过pyplot模块(import matplotlib.pyplot as plt),提供了一套和Matlab类似的命令API,将众多绘图对象所构成的复杂结构隐藏在这套API内部,这些对象对应图形的一个个图形元素(如坐标轴、曲线、文字等),模块给每个对象分配函数,以此对该图形元素进行操作,而不影响其他部分。创建好画布后,只需调用pyplot模块所提供的函数,仅几行代码就可以实现添加、修改图形元素或在原有图形上绘制新图形。
可以分为4个层次结构:
(1)canvas(画板):位于最底层,导入M库就自动存在;
(2)figure(画布):建立在canvas之上,从这一层就能开始设置其参数;
(3)axes(子图):将figure分成不同块,实现分面绘图;
(4)图表信息(构图元素):添加或修改axes上的图形信息,优化图表的显示效果。
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 23 17:24:50 2021
@author: 86493
"""
import matplotlib.pyplot as plt
import numpy as np
plt.figure(1) # 创建画布
x = np.linspace(0, 1, 1000)
plt.subplot(2, 1, 1)# 分为2*1的图形阵,选择第一章图片绘图
plt.title('y=x^2 & y=x')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim((0, 1))
plt.ylim((0, 1))
plt.xticks([0, 0.3, 0.6, 1])# 设置刻度
plt.yticks([0, 0.5, 1])
plt.plot(x, x ** 2)
plt.plot(x, x)
plt.legend(['y=x^2', 'y=x'])# 添加图例
plt.savefig('first.png')
plt.show()
3.中文字符显示
# 中文字符显示
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 10, 0.2)
y = np.sin(x)
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False # 解决负号"-"显示异常
plt.title('sin曲线')
plt.plot(x, y)
plt.savefig('third.png')
plt.show()
4.坐标轴字符刻度标注
# 坐标轴字符刻度标注
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) # 季度标号
y = np.array([100, 104, 106, 95, 103, 105, 115, 100])
v = ['2020年一季度', '2020年二季度','2020年三季度','2020年四季度',
'2021年一季度','2021年二季度','2021年三季度','2021年四季度',]
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei
plt.title('某产品2020-2021各季度销售额')
plt.plot(x, y)
plt.xlabel('季度')
plt.xticks(x, v, rotation = 45) # v为与x对应的字符刻度,rotation为旋转角度
plt.ylabel('销售额(万元)')
plt.show()
5.散点图
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 23 18:06:20 2021
@author: 86493
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
path = '一、车次上车人数统计表.xlsx'
data = pd.read_excel(path)
tb = data.loc[data['车次'] == 'D02', ['日期', '上车人数']]
x = np.arange(1, len(tb.iloc[:, 0])+1)
y1 = tb.iloc[:, 1]
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei
plt.scatter(x, y1)
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.xticks([1, 5, 10, 15, 20, 24],
tb['日期'].values[[0, 4, 9, 14, 19, 23]],
rotation = 45)
# 2为与1对应的字符刻度
plt.title('D02车次上车人数散点图')
6.线形图
# 2.线性图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
path='一、车次上车人数统计表.xlsx'
data=pd.read_excel(path)
# 筛选数据
tb = data.loc[data['车次'] == 'D02', ['日期', '上车人数']]
tb = tb.sort_values('日期')
tb1 = data.loc[data['车次'] == 'D03', ['日期', '上车人数']]
tb1 = tb1.sort_values('日期')
# 构造绘图所需的横轴数据列和纵轴数据列
x = np.arange(1, len(tb.iloc[:, 0]) + 1)
y1 = tb.iloc[:, 1]
y2 = tb1.iloc[:, 1]
# 定义绘图figure界面
plt.figure(1)
# 在figure界面上绘制两个线形图
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.plot(x, y1, 'r*--') # 红色*号连续图,绘制D02车次
plt.plot(x, y2, 'b*--') # 蓝色*号连续图,绘制D03车次
# 对横轴和纵轴打上中文标签
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('上车人数走势图') # 标题
plt.legend(['D02', 'D03']) # 图例
plt.xticks([1, 5, 10, 15, 20, 24],
tb['日期'].values[[0, 4, 9, 14, 19, 23]],
rotation = 45)
plt.savefig('myfigure1')
7.柱状图
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 24 16:07:29 2021
@author: 86493
"""
# 3.柱状图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
path='一、车次上车人数统计表.xlsx'
data=pd.read_excel(path)
# 筛选数据
tb = data.loc[data['车次'] == 'D02', ['日期', '上车人数']]
tb = tb.sort_values('日期')
tb1 = data.loc[data['车次'] == 'D03', ['日期', '上车人数']]
tb1 = tb1.sort_values('日期')
# 构造绘图所需的横轴数据列和纵轴数据列
x = np.arange(1, len(tb.iloc[:, 0]) + 1)
y1 = tb.iloc[:, 1]
y2 = tb1.iloc[:, 1]
plt.figure(2) # 创建画布
plt.bar(x, y1)
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('D02车次上车人数柱状图')
plt.xticks([1, 5, 10, 15, 20, 24],
tb['日期'].values[[0, 4, 9, 14, 19, 23]],
rotation = 45)
plt.savefig('guofigure2')
8.直方图
# 直方图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
path='一、车次上车人数统计表.xlsx'
data=pd.read_excel(path)
# 筛选数据
tb = data.loc[data['车次'] == 'D02', ['日期', '上车人数']]
tb = tb.sort_values('日期')
tb1 = data.loc[data['车次'] == 'D03', ['日期', '上车人数']]
tb1 = tb1.sort_values('日期')
# 构造绘图所需的横轴数据列和纵轴数据列
x = np.arange(1, len(tb.iloc[:, 0]) + 1)
y1 = tb.iloc[:, 1]
y2 = tb1.iloc[:, 1]
plt.figure(3)
plt.hist(y1)
plt.xlabel('上车人数')
plt.ylabel('频次')
plt.title('D02车次上车人数直方图')
plt.savefig('guofigure3')
9.饼图
原始数据还是上车人数那坨:
# 饼图
plt.figure(4) # 画布
# 1.计算D02~D06车次同期的上车人数总和,并用list1来保存其结果
D = data.iloc[:, 0]
D = list(D.unique()) # 车次号D02~D06,此处去重
list1 = [] # 预定义每个车次的上车人数列表
for d in D:
# 计算每个车次的上车人数
dt = data.loc[data['车次'] == d, ['上车人数']]
s =dt.sum()
# print(s,"n")
list1.append(s['上车人数']) # 或者s[0]
# 2.绘制饼图
plt.pie(list1, labels = D, autopct = '%1.2f%%') # 绘制饼图,百分比保留小数点后两位
plt.title('各车次上车人数百分比饼图')
plt.savefig('guofigure4')
10.箱线图
# 箱线图
plt.figure(5)
plt.boxplot([y1.values, y2.values])
#print(y1.values)
plt.xticks([1, 2], ['D02', 'D03'], rotation = 0)
plt.title('D02、D03车次上车人数箱线图')
plt.ylabel('上车人数')
plt.xlabel('车次')
plt.savefig('guofigure5')
11.子图
将上面的几个图弄个大汇总,在同一幅画布上:
# 4.2.7 子图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #导入绘图库中的pyplot模块,并且简称为plt
#读取数据
path='一、车次上车人数统计表.xlsx';
data=pd.read_excel(path);
#筛选数据
tb=data.loc[data['车次'] == 'D02',['日期','上车人数']];
tb=tb.sort_values('日期');
tb1=data.loc[data['车次'] == 'D03',['日期','上车人数']];
tb1=tb1.sort_values('日期');
#构造绘图所需的横轴数据列和纵轴数据列
x=np.arange(1,len(tb.iloc[:,0])+1)
y1=tb.iloc[:,1]
y2=tb1.iloc[:,1]
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei
plt.figure('子图')
plt.figure(figsize=(10,8))
plt.subplot(3,2,1)
plt.scatter(x,y1)
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.xticks([1,5,10,15,20,24], tb['日期'].values[[0,4,9,14,19,23]], rotation = 45)
plt.title('D02车次上车人数散点图')
plt.subplot(3,2,2)
plt.plot(x,y1,'r*--')
plt.plot(x,y2,'b*--')
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('上车人数走势图')
plt.legend(['D02','D03'])
plt.xticks([1,5,10,15,20,24], tb['日期'].values[[0,4,9,14,19,23]], rotation = 45)
plt.subplot(3,2,3)
plt.bar(x,y1)
plt.xlabel('日期')
plt.ylabel('上车人数')
plt.title('D02车次上车人数柱状图')
plt.xticks([1,5,10,15,20,24], tb['日期'].values[[0,4,9,14,19,23]], rotation = 45)
plt.subplot(3,2,4)
plt.hist(y1)
plt.xlabel('上车人数')
plt.ylabel('频数')
plt.title('D02车次上车人数直方图')
plt.subplot(3,2,5)
D=data.iloc[:,0]
D=list(D.unique()) #车次号D02~D06
list1=[] #预定义每个车次的上车人数列表
for d in D:
dt=data.loc[data['车次'] == d,['上车人数']]
s=dt.sum()
list1.append(s['上车人数']) #或者s[0]
plt.pie(list1,labels=D,autopct='%1.2f%%') #绘制饼图,百分比保留小数点后两位



