机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)

文章目录

  • 系列文章
  • 3.1 Matplotlib之Hello World
    • 1 Matplotlib介绍
    • 2 Matplotlib画图流程
  • 3.2 基础绘图功能(以折线图为例)
      • 1 坐标刻度、标签、网格、图像保存
      • 2 在一个坐标系里绘制多个图
      • 3 在一个图里绘制多个坐标系
        • 方式一:figure的add_subplot
        • 方式二:plt的subplot
        • 方式三:plt的subplots
  • 3.3 常见图形绘制
      • 1 折线图
      • 2 散点图
      • 3 柱状图
      • 4 直方图
      • 5 饼图
      • 6 特殊柱状图
        • 两条柱状图
        • 水平柱状图
        • 堆叠柱状图


系列文章

机器学习入门 01 —— 机器学习概述
机器学习入门 02 —— 环境搭建(Jupyter Notebook 及扩展库的安装与使用)
机器学习入门 03 —— Matplotlib使用
机器学习入门 04 —— Numpy使用
机器学习入门 05 —— Pandas使用
机器学习入门 06 —— Seaborn使用


3.1 Matplotlib之Hello World

1 Matplotlib介绍

 

  • 专门用于开发2D图表(3D也可以,但不常用)

  • 以渐进、交互式方式实现数据可视化(之前我Python博客里用过网页来进行可视化,而Matplotlib是python真正的可视化方式)

  • 为什么要学习Matplotlib?

    • 可视化是整个数据挖掘的关键辅助工具,能让我们清晰理解数据从而调整分析方法。
    • 例如下面图片就是用Matplotlib实现
    机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第1张图片

     

2 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()

效果:

机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第2张图片

图像结构:

机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第3张图片

 

3.2 基础绘图功能(以折线图为例)

 

1 坐标刻度、标签、网格、图像保存

下面是常用功能演示:

说明下,里面用到了列表生成式,[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()

效果:

机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第4张图片

可能很多人在进行中文标签显示时出现了乱码,这是因为Matplotlib的默认字体并不支持中文,所以需要我们对字体进行切换。解决方法请看我另一篇博客:解决Matplotlib中文乱码问题

2 在一个坐标系里绘制多个图

 

代码:

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()

效果:

机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第5张图片

3 在一个图里绘制多个坐标系

 

方式一:figure的add_subplot

其中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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第6张图片

 

方式二:plt的subplot

绘制不规则的图像。

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第7张图片

 

方式三:plt的subplots

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第8张图片

 

3.3 常见图形绘制

 

官方链接:https://matplotlib.org/index.html

1 折线图

 

特点:能够显示数据的变化趋势,反映食物的变化情况。(变化)

Api:plt.plot(x, y)

前面的举例都是折线图,这里就不再说明了。

 

2 散点图

 

特点:判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第9张图片

 

3 柱状图

 

特点:能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第10张图片

 

4 直方图

 

特点:绘制连续性的数据,展示一组或多组数据的分布状况(统计)

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第11张图片

 

5 饼图

 

特点:分类数据的占比情况(占比)

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第12张图片

6 特殊柱状图

两条柱状图

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第13张图片

水平柱状图

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第14张图片

堆叠柱状图

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()
机器学习入门 03 —— Matplotlib使用(折线图、散点图、柱状图、直方图、饼图、堆叠柱状图等)_第15张图片

你可能感兴趣的:(机器学习,机器学习,matplotlib)