数据分析(三)matplotlib ---数据可视化库

matplotlib介绍

数据可视化的库

不仅可以绘制 2-D图,也可以绘制 3-D图

# 导包
import matplotlib.pyplot as plt

绘图三部曲:

  1. 创建画布
  2. 绘图
  3. 图形展示

一、绘图基础语法与常用参数

1、基本绘图流程

在这里插入图片描述

2、创建画布与子图

函数名称函数作用
plt.figure创建一个空白画布,可以指定画布大小,像素。
figure.add_subplot创建并选中子图,可以指定子图的行数、列数、与选中图片编号。

3、图形修饰

函数名称函数作用
plt.title给当前图形添加标题
plt.xlabel添加 x 轴名称
plt.ylabel添加 y 轴名称
plt.xlim指定当前图形 x 轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.ylim指定当前图形 y 轴的范围,只能确定一个数值区间,而无法使用字符串标识
plt.xticks指定 x 轴刻度的数目与取值,可以使用字符串进行标识
plt.yticks指定 y 轴刻度的数目与取值,可以使用字符串进行标识
plt.legend增加图例,可以指定图例的位置 loc
plt.text标注具体数值

4、图片的保存与展示

函数名称函数作用
plt.savefig保存绘制的图片,在图形修饰完之后,图形展示之前
plt.show图形展示

5、RC参数

# 设置RC参数,使其支持中文
plt.rcParams['font.sans-serif']='SimHei'
# 设置RC参数,使其支持负号
plt.rcParams['axes.unicode_minus']=False

线条

rc 参数名称解释
color线条的颜色
linestyle线条的样式
linewidth线条的宽度
marker点的形状
markersize点的大小
markerfacecolor点的填充颜色
markeredgecolor点的边缘颜色
  • 常见线条类型解释
linestyle取值意义linestyle取值意义
-实线-.点线
长虚线:短虚线
  • 线条标记解释
marker取值意义marker取值意义
“o”圆圈“.”
“D”菱形“s”正方形
“h”六边形1“*”星号
“H”六边形2“d”小菱形
“-”水平线“v”一角朝下的三角形
“8”八边形“<”一角朝左的三角形
“p”五边形“>”一角朝右的三角形
“,”像素“^”一角朝上的三角形
“+”加号"\ "竖线
“None”“x”X

如果想要参考更多线条样式、颜色,请访问:

https://www.cnblogs.com/darkknightzh/p/6117528.html

二、绘制图形

1、折线图(plot)

matplotlib.pyplot.plot(*args,**kwargs)

plot 函数在官方文档的语法中只要求填入不定长参数,实际可以填入的参数主要如下:

参数名称说明
x,y接收 array。表示 x 轴和 y 轴对应的数据。
color接收特定 string。指定线条的颜色
linestyle接收特定 string。指定线条类型。默认为”-“。
marker接收特定 string。表示绘制的点的形状。
alpha接收 0-1的小数。表示点的透明度。
  • color 参数的 8 中常用颜色的缩写。
颜色缩写代表的颜色颜色缩写代表的颜色
b蓝色m品红
g绿色y黄色
r红色k黑色
c青色w白色

案例一:

绘制下一周北京、广州天气温度走势图

  • 注意:如果横坐标是中文字符串形式的,先用序号代替,之后再用字符串替换
import matplotlib.pyplot as plt
import numpy as np

# 1、创建画布
plt.figure()
# 修改RC参数,让其支持中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC参数,让其支持负号
plt.rcParams['axes.unicode_minus'] = False

# 2、绘图
##  构建x,y轴数据
x = np.arange(1, 8)
y1 = np.array([-10, -8, -6, -10, -12, -4, 2]) # 北京天气
y2 = np.array([26, 24, 22, 24, 25, 20, 18]) # 广州天气
##  绘制折线图
plt.plot(x, y1, color='r', linestyle=':', linewidth=1.2, marker="*", markersize=7, markerfacecolor='b', markeredgecolor='g')
plt.plot(x, y2, color='b', linestyle='-.', linewidth=1.2, marker="o", markersize=7, markerfacecolor='r', markeredgecolor='r')

##  图形修饰
##  1.增加标题
plt.title("下一周北京、广州天气温度走势图")
##  2.增加x轴名称
plt.xlabel("日期")
##  3.增加y轴名称
plt.ylabel("温度℃")
##  4.修改x轴刻度
# 用中文字符串替换序号
# 参数1 序号
# 参数2 中文字符串
xticks = ["周一","周二","周三","周四","周五","周六","周日"]
plt.xticks(x, xticks)
##  5.修改y轴刻度
# 如果只是修改数值的取值范围 ---重新设置刻度
# 参数 新的刻度
yticks = np.arange(-15, 31, 3)
plt.yticks(yticks)
##  6.增加图例
# loc --调整图例的位置
legend = ["北京","广州"]
plt.legend(legend, loc=0)
##  7.进行标注
for i,j in zip(x,y1):
    # 参数1 标注的横坐标
    # 参数2 标注的纵坐标
    # 参数3 标注的内容
    # horizontalalignment='center' --让标注水平居中
    plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')

for i,j in zip(x,y2):
    plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')

# 保存图片
plt.savefig("./下一周北京、广州天气温度走势.png")

# 3、图形展示
plt.show()

案例二:

  1. 加载 国民经济核算季度数据.npz 文件

    链接:https://pan.baidu.com/s/1m3CcoWuCDsWZDRQWdzlzfg
    提取码:c0gv

  2. 绘制 2000-2017各产业生产总值折线图.png

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """数据可视化"""
    # 1、创建画布
    plt.figure(figsize=(10, 8), dpi=100)
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、绘图
    # 准备x轴和y轴数据
    x = np.arange(1, values.shape[0] + 1)
    # 第一产业总值
    y1 = values[:, 3]
    # 第二产业总值
    y2 = values[:, 4]
    # 第三产业总值
    y3 = values[:, 5]
    # 绘制折线图
    # fmt = '[marker][line][color]'
    plt.plot(x, y1, 's-b')
    plt.plot(x, y2, 'o-.r')
    plt.plot(x, y3, 'o--g')

    # 图形修饰
    # 增加标题
    plt.title("2000-2017年各产业季度生产总值折线图")
    # 增加y轴名称
    plt.ylabel("生产总值(亿元)")
    # 修改x轴刻度
    # 用中文字符串替换序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加图例
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)

    # 保存图片
    plt.savefig("./2000-2017各产业生产总值折线图.png")

    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、数据可视化
    show_data(columns, values)

if __name__ == '__main__':
    main()

结果展示:

在这里插入图片描述

那么我们如何在一个画布中,绘制多个图形呢?

  • 绘制子图
fig.add_subplot(nrows, ncols, index)
  • 调整子图间距
fig.subplots_adjust(wspace,hspace)

绘制下图:

在这里插入图片描述

代码实现:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    # 1、创建画布
    # 返回一个画布对象
    fig = plt.figure(figsize=(12, 10), dpi=100)
    # 调整子图间距
    # hspace ---上下子图的高度差
    # wspace ---左右子图的宽度差
    # 给定值为小数,意义为占 子图的占比
    fig.subplots_adjust(hspace=0.3)
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、绘图
    # 2行1列第一个子图
    # 参数1 绘制的子图的行数
    # 参数2 绘制子图的列数
    # 参数3 第几个子图
    fig.add_subplot(2, 1, 1)
    # 准备x轴和y轴数据
    x = np.arange(1, values.shape[0] + 1)
    # 第一产业总值
    y1 = values[:, 3]
    # 第二产业总值
    y2 = values[:, 4]
    # 第三产业总值
    y3 = values[:, 5]
    # 绘制折线图
    # fmt = '[marker][line][color]'
    plt.plot(x, y1, 's-b')
    plt.plot(x, y2, 'o-.r')
    plt.plot(x, y3, 'o--g')

    # 图形修饰
    # 增加标题
    plt.title("2000-2017年各产业季度生产总值折线图")
    # 增加y轴名称
    plt.ylabel("生产总值(亿元)")
    # 修改x轴刻度
    # 用中文字符串替换序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加图例
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)

    # 绘制第2个子图
    fig.add_subplot(2, 1, 2)
    # 准备x轴和y轴数据
    color_list = ['k','g','b','yellow','lime','m','c','peru','orangered']
    num = 0
    for i in range(6, 15):
        y = values[:, i]
        plt.plot(x, y, '%s' % color_list[num])
        num += 1


    # y1 = values[:, 6]
    # y2 = values[:, 7]
    # y3 = values[:, 8]
    # y4 = values[:, 9]
    # y5 = values[:, 10]
    # y6 = values[:, 11]
    # y7 = values[:, 12]
    # y8 = values[:, 13]
    # y9 = values[:, 14]
    # # 绘制图形
    # plt.plot(x, y1)
    # plt.plot(x, y2)
    # plt.plot(x, y3)
    # plt.plot(x, y4)
    # plt.plot(x, y5)
    # plt.plot(x, y6)
    # plt.plot(x, y7)
    # plt.plot(x, y8)
    # plt.plot(x, y9)

    # y = values[:, 6:]
    # # 绘制图形
    # # 折线图绘制的时候,每一个x,拿出一列又一列分别的去绘制折线图
    # plt.plot(x, y)


    # 增加x轴名称
    plt.xlabel("年份")
    # 增加y轴名称
    plt.ylabel("生产总值(亿元)")
    # 修改x轴刻度
    # 用中文字符串替换序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加图例
    legend = [tmp[:2] for tmp in columns[6:]]
    plt.legend(legend)

    # 保存图片
    plt.savefig("./2000-2017各产业、行业生产总值折线图.png")

    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、数据可视化
    show_data(columns, values)
    # 3、结论
    # xxxxxxxxx

if __name__ == '__main__':
    main()
  • 应用场景

查看数据的发展趋势、变化、走势

如:游戏的在线人数在每天不同的时间段的变化趋势

如:某公司上线的产品在不同的时间段的人数变化

2、散点图(scatter)

matplotlib.pyplot.scatter(x, y, s, c, marker)

常用参数及说明如下表所示:

参数名称说明
x , y接收 array。表示 x轴和 y 轴对应的数据。
s指定点的大小,可以传单个大小,也可以传 array_like。
c指定点的颜色,可以传单个颜色,也可以传 array_like
marker点的形状。只能传入单个形状,不能传入 array_like

任务实现:

在这里插入图片描述

代码实现:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """数据可视化"""
    # 1、创建画布
    plt.figure(figsize=(10, 8), dpi=100)
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、绘图
    # 构建横纵坐标数据
    x = np.arange(values.shape[0])
    y1 = values[:,3]
    y2 = values[:,4]
    y3 = values[:,5]
    # 绘制散点图
    plt.scatter(x, y1, c='r', marker="o")
    plt.scatter(x, y2, c='b', marker='s')
    plt.scatter(x, y3, c='yellow', marker='v')

    # 图形修饰
    plt.title("2000-2017年各产业季度生产总值散点图")
    plt.ylabel("生产总值(亿元)")
    xticks = values[:,1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)
    # 保存图片
    plt.savefig("./2000-2017年各产业季度生产总值散点图.png")

    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、数据可视化
    show_data(columns, values)
    # 3、结论

if __name__ == '__main__':
    main()
  • 应用场景
  1. 类似于折线图的这种散点图,可以用来观察数据的走势
  2. 一堆一堆的散点图,可以用来查看数据的紧密联系程度
  3. 也可以用来对比不同的类别—(一般不用)

3、直方图与柱状图的区别

直方图:

  • 由紧密结合的多个柱子组成
  • 横轴为数据的分布范围区间
  • 纵轴为数据落在各个区间内的数量
  • 一般用于查看数据的分布范围
  • 应用于大量数据的场景

柱状图:

  • 由多个分开的柱子组成
  • 横轴一般为数据的各个类别
  • 纵轴为各个类别所对应的数量
  • 一般用于各个类别之间的对比
  • 一般用于少量数据类别的对比

4、柱状图(bar)

plt.bar(left, height, width=0.8,color)

常用参数及说明如下表所示:

参数名称说明
left接收 array。表示 x 轴数据。
height接收 array。表示 x 所代表数据的数量。
width接收 0-1 之间的 float。指定直方图宽度。默认为 0.8.
color接收特定 string 或者包含颜色字符串的 array。 表示直方图颜色。默认为 None。

任务实现:

在这里插入图片描述

代码实现:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """数据可视化"""
    # 1、创建画布
    plt.figure()
    # 修改RC参数,让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC参数,让其支持负号
    plt.rcParams['axes.unicode_minus'] = False
    
    # 2、绘图
    # 横轴--第一产业、第二产业、第三产业
    x = np.arange(3)
    # 纵轴--各个产业--在2000年的值
    y = values[0,3:6] / 1000
    
    # 绘制柱状图
    # width ---柱子的宽度
    # color--可以给定一个具体的颜色,也可以给一个颜色 array_like
    plt.bar(x, y, width=0.3, color=['r', 'g', 'b'])
    
    # 图形修饰
    plt.title("2000年第一季度国民生产总值产业构成分布柱状图") # 增加标题
    plt.xlabel("产业") # 横轴名称
    plt.ylabel("生产总值(千亿元)") # 纵轴名称
    # 修改横轴刻度
    xticks = [tmp[:4] for tmp in columns[3:6]]
    plt.xticks(x, xticks)
    
    # 进行标注
    for i,j in zip(x, y):
        plt.text(i, j + 0.1, "%.2f千亿元" % j, horizontalalignment='center')
    
    # 柱状图不需要增加图例
    # 保存图片
    plt.savefig("./2000年第一季度国民生产总值产业构成分布柱状图.png")
    
    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、数据可视化
    # 3、结论

if __name__ == '__main__':
    main()

5、直方图(hist)

import matplotlib.pyplot as plt
import numpy as np

# 1、创建画布
plt.figure()
# 2、绘制图形
# 绘制某班同学身高分布情况 ---30位同学
high = np.random.uniform(low=140, high=190, size=30)
# print("high:\n", high)
# 将身高保留一位小数
high = np.array([float("%.1f" % i) for i in high])
print("high:\n", high)

# 绘制直方图
# 默认分组
# plt.hist(high, bins=5)
# 自定义分组
# bins = [140, 150, 160, 170, 180, 190]
# plt.hist(high, bins)

# 按照数据进行自定义等宽分组
# (1)确定分组个数
group_num = 5
# (2)确定每一组的步长
# 确定最大值
max_high = np.max(high)
# 确定最小值
min_high = np.min(high)
# 确定最大值与最小值的差距 ---极差
ptp = max_high - min_high
# 确定步长
step = np.ceil(ptp / group_num)
# (3)确定bins
bins = np.arange(min_high, max_high + step, step)

print("max_high:\n", max_high)
print("min_high:\n", min_high)
print("bins:\n", bins)

# 绘制直方图
plt.hist(high, bins=bins, color="b", edgecolor="k")

# 设置刻度
plt.xticks(bins)

yticks = np.arange(11)
plt.yticks(yticks)

# 不能标注
# 增加网格线
plt.grid(b=True, axis="y")

# 直方图不能增加图例


# 3、图形展示
plt.show()

结果展示:

在这里插入图片描述

6、饼图(pie)

饼图 ----将各部分全部绘制在同一个饼中,可以体现出各部分的占比。

  • 应用场景:
    • 对比各部分的占比情况
    • 也可以对比部分与整体的关系
import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data():
    """数据可视化"""
    # 1、创建画布
    plt.figure()
    # 2、绘制图形
    # 构建绘制饼图的数据
    x = values[-1, 3:6]
    
    # explode ---表示各部分距离圆心的半径 ---也可以理解为 各部分之间的间隙
    explode = (0.01, 0.02, 0.01) # 占半径的占比
    
    # labels ---每一项的名称
    labes = [tmp[:4] for tmp in columns[3:6]]
    
    # colors --- 设置颜色
    colors = ["r", "g", "b"]
    
    # autopct ---用来显示各部分占比
    autopct = "%.1f%%"
    
    # pctdistance ---控制着标注的位置,默认为距离圆心0.6个半径的位置
    pctdistance = 0.6
    
    # labeldistance ---控制着名称的位置,默认为距离圆心1.1个半径的位置
    labeldistance = 1.1
    
    # radius ---表示饼图的半径
    radius = 1.0
    
    # 绘制饼图
    plt.pie(x, explode=explode, labels=labels, colors=colors, autopct=autopct, pctdistance=pctdistance, labeldistance=labeldistance, radius=radius)
    
    # 将饼图由椭圆 变为圆形
    # 椭圆里面 有个长轴、短轴 ---> 长轴=短轴 --->圆
    plt.axis('equal')
    
    # 增加标题
    plt.title("2017年各个产业的增加总值占比情况")
    # 设置图例
    plt.legend(labels)
    
    # 保存图片
    plt.savefig("./2017年各个产业的增加总值占比情况.png")
    
    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、数据可视化
    show_data(columns, values)

if __name__ == '__main__':
    main()

结果展示:

在这里插入图片描述

7、箱线图(boxplot)

箱线图 —利用最小值、下四分位数、中位数、上四分位数、最大值来进行描述数据。

应用场景:

  • 可以用来查看数据的是否对称、离散、分布
  • 借助箱线图分析剔除异常值(远离正常范围的错误的值)
import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加载数据"""
    res = np.load("./国民经济核算季度数据.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """数据可视化"""
    # 1、创建画布
    plt.figure()
    # 2、绘制图形
    x = values[:,3:6]
    
    # notch ---是否有缺口
    # meanline=True, showmeans=True 同时使用,才能在箱线图上显示出均值
    # vert=False ---绘制水平的箱子
    # labels 名称
    labels = [tmp[:4] for tmp in columns[3:6]]
    
    # 绘制箱线图
    plt.boxplot(x, notch=True, meanline=True, showmeans=True, labels=labels)
    # 3、图形展示
    plt.show()

def main():
    # 1、加载数据
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)

if __name__ == '__main__':
    main()

结果实现:

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值