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

it2023-01-11  50

1 Matplotlib介绍与安装

Matplotlib介绍

什么是Matplotlib

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

为什么要学习Matplotlib

将数据进行可视化,使数据更直观使数据更加更具有说服力

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图片 subplot(nrows, ncols, index, **kwargs)

除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片,然后返回包含了已生成子图对象的Numpy数组。 • plt.subplots(nrows, ncols, sharex, sharey) • nrows子图的行数 • ncols子图的列数 • sharex 所有子图使用相同的x轴刻度 • sharey 所有子图使用相同的y轴刻度 那么实际上,当我们不需要使用子图时,可以通过plt对象直接绘制图形。 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 ]

Matplotlib绘制图形

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

3 折线图

折线图介绍 折线图以折线的上升或下降来表示统计数量的增减变化的统计图 特点:能够显示数据的变化趋势,反映事物的变化情况

折线图绘制

折线图可以通过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()

又写了一个例子

练习

假设一天中每隔两个小时的气温分别是[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()

图形组成

实际上,图形的组成除了x,y轴。还有很多组件。如下图

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

需要放大画布而且旋转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()

设置刻度 以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()

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

图形组成

实际上,图形的组成除了x,y轴。还有很多组件。如下图

中文显示问题

当我们需要设置轴标签,标题等,通常会使用到中文。但是,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()

总结

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

添加数据标签注释文本 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()

添加注释文本

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

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

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

最新回复(0)