机器学习入门 01 —— 机器学习概述
机器学习入门 02 —— 环境搭建(Jupyter Notebook 及扩展库的安装与使用)
机器学习入门 03 —— Matplotlib使用
机器学习入门 04 —— Numpy使用
机器学习入门 05 —— Pandas使用
机器学习入门 06 —— Seaborn使用
专门用于开发2D图表(3D也可以,但不常用)
以渐进、交互式方式实现数据可视化(之前我Python博客里用过网页来进行可视化,而Matplotlib是python真正的可视化方式)
为什么要学习Matplotlib?
# 1. 导包
import matplotlib.pyplot as plt
# 2. 创建画布,figsize:指定图的长宽,dpi图像的清晰度。函数返回一个fig对象。
plt.figure(figsize=(5,3), dpi=100)
# 3. 绘制折线图,参数分别是X和Y轴
plt.plot([1,2,3,4,5],[17,17,18,15,11])
# 4. 显示图像
plt.show()
效果:
图像结构:
下面是常用功能演示:
说明下,里面用到了列表生成式,[random.uniform(15, 18) for i in x]
,相当于是遍历了60次(因为x长度60),每次获取[15,18)间的一个数,最后得到一个列表。
import matplotlib.pyplot as plt
import random
# 0. 准备数据
x = range(60) # 创建0-60的列表(不包括60)
y = [random.uniform(15, 18) for i in x] # uniform(a, b)随机生成一个a-b间的一个数;
# 1. 创建画布
plt.figure(figsize=(10, 6), dpi=100)
# 2. 绘制折线图
plt.plot(x, y)
# 修改线条形状和颜色
# plt.plot(x, y, 'r') # 'r'红色 、'y'黄色、'b'蓝色
# plt.plot(x, y, '--') # '--'虚线、'-'实线、's'方块、'*'星型、'o'圆圈、'^'三角
# plt.plot(x, y1, 'ro--') # 'ro--'红色圆圈虚线、'g^-'绿色三角实线、'b-.'蓝色点实线
# 2.1 添加x y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 修改x,y轴刻度显示,使其间隔为5(x[::]表示步长为5)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示(linestyle是每个线条样式,alpha是线条透明度)
plt.grid(True, linestyle='--', alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间", fontsize=20)
plt.ylabel("温度", fontsize=20)
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
# 3. 保存图像(这一步必须在show前面,因为show会释放资源)
plt.savefig('temp.png')
# 4. 显示图像
plt.show()
效果:
可能很多人在进行中文标签显示时出现了乱码,这是因为Matplotlib的默认字体并不支持中文,所以需要我们对字体进行切换。解决方法请看我另一篇博客:解决Matplotlib中文乱码问题
代码:
import matplotlib.pyplot as plt
import random
x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x] # 第二条折线的数据
plt.figure(figsize=(10, 6), dpi=100)
# label指定图例,即右上角的指示
plt.plot(x, y1, label="第一条")
# 绘制第二条折线, color 指定颜色(r、g、b、w、c、m、y、k),linestyle指定线条样式(-、--、-.、:、空格)
plt.plot(x, y2, color='y', linestyle='--', label="第二条")
# 显示图例, loc指示图例的位置(best、center、upper right、lower left等)
plt.legend(loc='best')
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("时间", fontsize=20)
plt.ylabel("温度", fontsize=20)
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
plt.savefig('temp.png')
plt.show()
效果:
其中221表示,共有2行2列,这是第1个。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
fig=plt.figure()
# 画第1个图:折线图
x=np.arange(1,100)
ax1=fig.add_subplot(221)
ax1.plot(x,x*x)
# 画第2个图:散点图
ax2=fig.add_subplot(222)
ax2.scatter(np.arange(0,10), np.random.rand(10))
# 画第3个图:饼图
ax3=fig.add_subplot(223)
ax3.pie(x=[15,30,45,10],labels=list('ABCD'),autopct='%.0f',explode=[0,0.05,0,0])
# 画第4个图:条形图
ax4=fig.add_subplot(224)
ax4.bar([20,10,30,25,15],[25,15,35,30,20],color='b')
plt.show()
绘制不规则的图像。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
fig = plt.figure()
# 画第1个图:折线图
x=np.arange(1,100)
plt.subplot(221)
plt.plot(x,x*x)
# 画第2个图:散点图
plt.subplot(222)
plt.scatter(np.arange(0,10), np.random.rand(10))
# 画第3个图:条形图
# 前面的两个图占了221和222的位置,如果想在下面只放一个图,得把前两个当成一列,即2行1列第2个位置
plt.subplot(212)
plt.bar([20,10,30,25,15],[25,15,35,30,20],color='b')
plt.show()
import matplotlib.pyplot as plt
import random
x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x]
# 1. 创建画布。要绘制1行2列个坐标系,返回fig 画布,axes 坐标系列表。
fig, axes = plt.subplots(nrows=1,ncols=2, figsize=(20, 8), dpi=100)
# 2. 绘制图像。【如果是4个,就用axes[0][0],axes[0][1]表示第一行第一列和第二列图像】
axes[0].plot(x, y1, label="第一条")
axes[1].plot(x, y2, color='y', linestyle='--', label="第二条")
axes[0].legend(loc='best')
axes[1].legend(loc='best')
# 2.1 构造xy轴刻度
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 2.2 设置xy轴刻度,使其每个刻度间隔为5
axes[0].set_xticks(x[::5]) # 这是真实的x轴刻度
axes[0].set_yticks(y_ticks[::5]) # 这是真实的y轴刻度
axes[0].set_xticklabels(x_ticks_label[::5]) # 这是每个真实x轴刻度对应的标签值
# 这是第二个坐标系
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
# 2.3 添加网格
axes[0].grid(True, linestyle='--', alpha=0.5)
axes[1].grid(True, linestyle=':', alpha=0.5)
# 2.5 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)
# 2.6 图像保存
plt.savefig('temp.png')
# 2.7 图像显示
plt.show()
官方链接:https://matplotlib.org/index.html
特点:能够显示数据的变化趋势,反映食物的变化情况。(变化)
Api:plt.plot(x, y)
前面的举例都是折线图,这里就不再说明了。
特点:判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)
Api:plt.scatter(x, y)
# 0.准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67,
288.64, 163.56, 120.06, 207.83, 342.75, 147.9 , 53.06,
224.72, 29.51, 21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 ,
239.34, 140.32, 104.15, 176.84, 288.23, 128.79, 49.64,
191.74, 33.1 , 30.74, 400.02, 205.35, 330.64, 283.45]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制散点图
plt.scatter(x, y)
# 3.显示图像
plt.show()
特点:能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
Api:plt.bar(x, width, align='center'对齐, color='r')
# 0.准备数据
# 电影名字
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽']
# 横坐标
x = range(len(movie_name))
# 纵坐标-票房数据
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制柱状图
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g'])
# 2.1b修改x轴的刻度显示
plt.xticks(x, movie_name)
# 2.2 添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 2.3 添加标题
plt.title("电影票房收入对比")
# 3.显示图像
plt.show()
特点:绘制连续性的数据,展示一组或多组数据的分布状况(统计)
Api:plt.hist(x, bins=None组距)
import numpy as np
# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
density:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。density=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, density=0, facecolor="blue", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
# 显示
plt.show()
特点:分类数据的占比情况(占比)
Api:plt.pie(x, label=每部分名称, autopct=占比显示, colors=每部分颜色
label_list = ["第一部分", "第二部分", "第三部分"] # 各部分标签
size = [55, 35, 10] # 各部分大小
color = ["red", "green", "blue"] # 各部分颜色
explode = [0.05, 0, 0] # 各部分突出值
"""
绘制饼图
explode:设置各部分突出
label:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
返回值
l_text:圆内部文本,matplotlib.text.Text object
p_text:圆外部文本
"""
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.axis("equal") # 设置横轴和纵轴大小相等,这样饼才是圆的
plt.legend()
plt.show()
import matplotlib.pyplot as plt
import matplotlib
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
label_list = ['2014', '2015', '2016', '2017'] # 横坐标刻度显示值
num_list1 = [20, 30, 15, 35] # 纵坐标值1
num_list2 = [15, 30, 40, 20] # 纵坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
y:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x, num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar([i + 0.4 for i in x], num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50) # y轴取值范围
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend() # 设置题注
# 每条柱顶部文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
price = [39.5, 39.9, 45.4, 38.9, 33.34]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.8) # 从下往上画
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()
import matplotlib.pyplot as pltimport matplotlibmatplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falselabel_list = ['2014', '2015', '2016', '2017']num_list1 = [20, 30, 15, 35]num_list2 = [15, 30, 40, 20]x = range(len(num_list1))rects1 = plt.bar(x, num_list1, width=0.45, alpha=0.8, color='red', label="一部门")rects2 = plt.bar(x, num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)plt.ylim(0, 80)plt.ylabel("数量")plt.xticks(x, label_list)plt.xlabel("年份")plt.title("某某公司")plt.legend()plt.show()