Python数据分析课--第四节 Matplotlib---折线图

1 Matplotlib介绍与安装

Matplotlib介绍

什么是Matplotlib

Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。

为什么要学习Matplotlib

  1. 将数据进行可视化,使数据更直观
  2. 使数据更加更具有说服力
    Python数据分析课--第四节 Matplotlib---折线图_第1张图片

Matplotlib安装

由于Matplotlib是第三方库,所以我们需要安装它才可以使用。注意,Matplotlib3.0要求python3版本才可安装使用。
安装命令:pip install matplotlib
安装可参考官网:https://matplotlib.org/users/installing.html

2 Matplotlib绘图

图片与子图

Matplotlib所绘制的图位于图片(Figure)对象中。我们可以通过plt.figure生成一个新的图片:

from matplotlib import pyplot as plt
fig = plt.figure()
注意
• 在IPython中,执行该代码一个空白的绘图窗口就会出现,但在Jupyter中则没有任何显示
但是可以通过plt.subplot创建一个或多个子图。
如:带有四个子图的Matplotlib图片
Python数据分析课--第四节 Matplotlib---折线图_第2张图片
subplot(nrows, ncols, index, **kwargs)

Python数据分析课--第四节 Matplotlib---折线图_第3张图片
Python数据分析课--第四节 Matplotlib---折线图_第4张图片

除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片,然后返回包含了已生成子图对象的Numpy数组。
• plt.subplots(nrows, ncols, sharex, sharey)
• nrows子图的行数
• ncols子图的列数
• sharex 所有子图使用相同的x轴刻度
• sharey 所有子图使用相同的y轴刻度
那么实际上,当我们不需要使用子图时,可以通过plt对象直接绘制图形。
Python数据分析课--第四节 Matplotlib---折线图_第5张图片
python中[-1]、[:-1]、[::-1]、[2::-1]的使用方法

https://blog.csdn.net/ITOMG/article/details/88683256
import numpy as np
a=[1,2,3.4,5]
print(a)
[ 1 2 3 4 5 ]

print(a[-1]) ###取最后一个元素
[5]

print(a[:-1]) ### 除了最后一个取全部
[ 1 2 3 4 ]

print(a[::-1]) ### 取从后向前(相反)的元素
[ 5 4 3 2 1 ]

print(a[2::-1]) ### 取从下标为2的元素翻转读取
[ 3 2 1 ]
Python数据分析课--第四节 Matplotlib---折线图_第6张图片

Matplotlib绘制图形

matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等。
具体可参考:https://matplotlib.org/gallery/index.html

3 折线图

折线图介绍
折线图以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况
Python数据分析课--第四节 Matplotlib---折线图_第7张图片

折线图绘制

折线图可以通过plot()函数来绘制
• plt.plot(x, y) # 使用默认的线样式及颜色绘制x,y构建的图形

实例

数据如下,绘制折线图形
• x = [1,2,3,4]
• y = [2,3,1,2]

import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [2,3,1,2]

plt.plot(x,y)
plt.show()

又写了一个例子
Python数据分析课--第四节 Matplotlib---折线图_第8张图片

练习

假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形

# 练习 假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形
'''
体现变化:折现
x:时间
y:温度

'''
from matplotlib import pyplot as plt
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 每隔两个小时 0 2 4 ...24 ,其中0和24重合
x = range(2,26,2)
list(x)
# print(list(x))
plt.plot(x,y,color="g",linestyle="--",marker="o")
plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第9张图片

图形组成

实际上,图形的组成除了x,y轴。还有很多组件。如下图
Python数据分析课--第四节 Matplotlib---折线图_第10张图片
Python数据分析课--第四节 Matplotlib---折线图_第11张图片

其中range(0,24,0.5)里的start stop step 不要用浮点数

设置刻度 以0,0.5,1,1.5,2…23.5显示,可以使用

[i/2 for i in range(0,48)] 这个叫列表推导式

from matplotlib import pyplot as plt
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 每隔两个小时 0 2 4 ...24 ,其中0和24重合
x = range(0,24,2)
list(x)
# print(list(x))

# 设置刻度 以0,0.5,1,1.5,2.....23.5显示
x_t = [i/2 for i in range(0,48)]
plt.xticks(x_t)

# 绘制图形
plt.plot(x,y,color="g",linestyle="--",linewidth=2,marker="o",markersize=12)
# 展示图形
plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第12张图片
需要放大画布而且旋转45度

from matplotlib import pyplot as plt
# 放大画布
plt.figure(figsize=(14,8))
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 每隔两个小时 0 2 4 ...24 ,其中0和24重合
x = range(0,24,2)
list(x)
# print(list(x))

# 设置刻度 以0,0.5,1,1.5,2.....23.5显示
x_t = [i/2 for i in range(0,48)]
plt.xticks(x_t,rotation=45)

# 绘制图形
plt.plot(x,y,color="g",linestyle="--",linewidth=2,marker="o",markersize=12)
# 展示图形
plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第13张图片

设置刻度 以0h,0.5h,1h,1.5h,2h…23.5h显示,带单位的

可以这样实现 ["{}h".format(i/2) for i in range(0,48)]

from matplotlib import pyplot as plt
# 放大画布
plt.figure(figsize=(14,8))
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 每隔两个小时 0 2 4 ...24 ,其中0和24重合
x = range(0,24,2)
list(x)
# print(list(x))

# 设置刻度 以0,0.5,1,1.5,2.....23.5显示
# ticks:刻度 是小格格
# labels:标签 
x_t = [i/2 for i in range(0,48)]
# 标签
x_l = ["{}h".format(i/2) for i in range(0,48)]
plt.xticks(x_t,x_l,rotation=45)  # x_t刻度,x_l标签

# 绘制图形
plt.plot(x,y,color="g",linestyle="--",linewidth=2,marker="o",markersize=12)
# 展示图形
plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第14张图片

设置y轴刻度,带图例,保存

from matplotlib import pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
# 放大画布
plt.figure(figsize=(14,8))
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 每隔两个小时 0 2 4 ...24 ,其中0和24重合
x = range(0,24,2)
# list(x)
# print(list(x))

# 设置x刻度 以0,0.5,1,1.5,2.....23.5显示
x_t = [i/2 for i in range(0,48)]
# 标签
x_l = ["{}h".format(i/2) for i in range(0,48)]
plt.xticks(x_t,x_l,rotation=45)  # x_t刻度,x_l标签

# 设置y刻度 最大值最小值为范围
y_t = range(min(y),max(y)+1)  # range 如果要取到最大值需要右边加1
plt.yticks(y_t)

# 绘制图形
plt.plot(x,y,color="g",label="Centigrade",linestyle="--",linewidth=2,marker="o",markersize=12)

# 添加x轴标签
plt.xlabel("time")
# 添加y轴标签
plt.ylabel("temperature")
# 添加图例
plt.legend(loc='upper left')

# 添加标题
plt.title("temperature-change")

# 添加网格 颜色 虚点线
plt.grid(color="coral",linestyle="-.")

# 保存 要在show之前保存, 否则空白图
# plt.savefig("mat.png")
plt.savefig("mat.jpg")

# 展示图形
plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第15张图片

图形组成

实际上,图形的组成除了x,y轴。还有很多组件。如下图
Python数据分析课--第四节 Matplotlib---折线图_第16张图片
Python数据分析课--第四节 Matplotlib---折线图_第17张图片

中文显示问题

当我们需要设置轴标签,标题等,通常会使用到中文。但是,matplotlib默认不显示中文,如图:

解决方法

方法一 文前面 加入

import matplotlib  # 全局的设置方式 这是设置matplotlib自带的字体 只能设置.ttf字体 不支持.ttc字体
font = {
    'family':'SimHei',
    'weight':'bold',
    'size':12
}
matplotlib.rc("font", **font)

方法二

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

方法三

from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties 
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
x = [1,2,3,4]
y = [3,2,1,3]

plt.plot(x,y)
plt.xlabel("x轴标签",fontproperties=font)
plt.show()

全局设置是针对的所有字体,有缺点 ,局部可以有选择的

# 练习 假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形
# 10点到12点每一分钟的气温变化

import random
from matplotlib import pyplot as plt

'''
方法一中文字体
'''
# import matplotlib  # 全局的设置方式 这是设置matplotlib自带的字体 只能设置.ttf字体 不支持.ttc字体
# font = {
#     'family':'SimHei',
#     'weight':'bold',
#     'size':12
# }
# matplotlib.rc("font", **font)

'''
方法二中文字体
'''
# import matplotlib.pyplot as plt
# plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
# plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)

'''
方法三中文字体 局部的
相当于将字体注册到了matplotlib字体库中
让谁显示就给谁传参这里传给ticks
'''
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\STXINGKA.TTF", size=14)



x = range(0,120)
# 怎么生成120个随机数
y = [random.randint(20,38) for i in range(120)]
# print(y)
plt.plot(x,y)


# 刻度0,10,20,30,40,50,60.。。。110
x_t = range(0,120,10)
# 显示x轴刻度为 十点0分 十点10分..十点50分 十一点0分...十一点50分
x_l = ["十点{}分".format(i) for i in range(0,60,10)]
x_l += ["十一点{}分".format(i) for i in range(0,60,10)]
# print(x_l)
plt.xticks(x_t,x_l,rotation=45,fontproperties=font)

# 添加x轴标签
plt.xlabel("time")
# 添加y轴标签
plt.ylabel("temperature")


plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第18张图片

总结

4 练习

假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
要求:
• y轴表示个数
• x轴表示岁数,比如11岁,12岁

from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\STXINGKA.TTF", size=14) # 找到自带的字体格式

x = range(0,20)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]

plt.plot(x,y)

# 刻度
x_t = [i for i in range(0,20)] #刻度上的数值
x_l = ["{}岁".format(i) for i in range(11,31)]
plt.xticks(x_t,x_l,rotation=45,fontproperties=font)
plt.yticks(fontproperties=font)

# 字体设置 没用到
font1 = {'family':'Arial','weight':'normal','size':16}

# 标签
# 添加x轴标签
plt.xlabel("岁数",fontproperties=font)
# 添加y轴标签
plt.ylabel("交往个数",fontproperties=font)

plt.title("历年交往对象情况",fontproperties=font)

plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第19张图片

添加数据标签注释文本 annotate

# 假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
# a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
# b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
# 要求:
# • y轴表示个数
# • x轴表示岁数,比如11岁,12岁

from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\Windows\Fonts\STXINGKA.TTF", size=14) # 找到自带的字体格式

x = range(11,31)
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
my_cls_y = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]

plt.plot(x,y,label="自己",marker="o",markersize=12)
plt.plot(x,my_cls_y,label="同桌",marker="*",markersize=12)

# 图例
plt.legend(loc='upper left',prop=font) # 只针对于 ;legend,局部指定字体 要用 prop=font

# 刻度
x_t = [i for i in x] #刻度上的数值   这个可以不用,用不到
x_l = ["{}岁".format(i) for i in x]
plt.xticks(x_t,x_l,rotation=45,fontproperties=font)  # x_t可以不用,直接用x就行
plt.yticks(fontproperties=font)

# 字体设置 没用到
font1 = {'family':'Arial','weight':'normal','size':16}


# 标签
# 添加x轴标签
plt.xlabel("岁数",fontproperties=font)
# 添加y轴标签
plt.ylabel("交往个数",fontproperties=font)
plt.title("历年交往对象情况",fontproperties=font)

# 添加数据标签注释文本 annotate
# for x_i,y_i in zip(x,y):  # 只是给我添加 了
#     plt.annotate(f"{y_i}", xy=(x_i,y_i), xytext=(x_i-0.2,y_i+0.2),color="blue")

# 要是给同桌添加又要复制一遍上面的代码,冗余

# 因此考虑函数封装 自动添加标签
def auto_label(x_po,y_po):  #  添加形参
    for x_i, y_i in zip(x_po,y_po):  # 传入x_po,y_po
        plt.annotate(f"{y_i}", xy=(x_i,y_i), xytext=(x_i-0.2,y_i+0.2),color="blue")

auto_label(x,y) # “自己”调用
auto_label(x,my_cls_y) # “同桌”调用

plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第20张图片

添加注释文本

plt.annotate() 基本使用
• text 是注释的文本
• xy 是需要注释的点的坐标
• xytext 是注释文本的坐标
• arrowprops 是箭头的样式属性

from matplotlib import pyplot as plt
import random
# li = [random.randint(10,30) for i in range(10)]
# print(li)
y = [26, 20, 20, 20, 14, 16, 18, 21, 22, 12]
x = range(10)

plt.plot(x,y)
# 添加注释文本
plt.annotate("26",xy=(0,26),xytext=(-0.5,24),arrowprops={"width":0.1})

plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第21张图片

实现将每个点加上数据标签

from matplotlib import pyplot as plt
import random
# li = [random.randint(10,30) for i in range(10)]
# print(li)
y = [26, 20, 20, 20, 14, 16, 18, 21, 22, 12]
x = range(10)

plt.plot(x,y,marker="+")
# 添加注释文本
# plt.annotate("26",xy=(0,26),xytext=(-0.5,24),arrowprops={"width":0.1})

# 实现将每个点加上数据标签
# 思路:什么在变,对应的参数--坐标在变化
# 坐标是什么,是由x,y组成的,,,将(0,26),(1,20)....组成一个元组
# zip(x,y)是一个打包的,要释放的话用 list(zip(x,y))
# print(list(zip(x,y)))

# 遍历元组里的
for x_i,y_i in zip(x,y):
    plt.annotate(f"{y_i}", xy=(x_i,y_i), xytext=(x_i-0.2,y_i-1))

plt.show()

Python数据分析课--第四节 Matplotlib---折线图_第22张图片

你可能感兴趣的:(可视化,python)