python-数据分析(2-Matplotlib)

Matplotlib

2 Matplotlib

2.1 Matplotlib

2.1.1 Matplotlib介绍

Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。
为什么要学习Matplotlib

  1. 将数据进行可视化,使数据更直观.
  2. 使数据更加更具有说服力.
2.1.2 Matplotlib安装

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

2.2 Matplotlib绘图
2.2.1 图片与子图

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

from matplotlib import pyplot as plt      #plt是公用的别名,最好不要随便更改
fig = plt.figure()    #运行结果没有显示,但是已经生成了一块画布

# plt.subplot(221)  #创建一个或多个子图 前面的22 是创建2*2个子图,第一个2是行数,第二个2是列数,1是调用第一块,下面的相当于调用所有子图
ax1=plt.subplot(221)
ax2=plt.subplot(222)
ax3=plt.subplot(223)
ax4=plt.subplot(224)

在这里插入图片描述


除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片。
plt.subplots(nrows, ncols, sharex, sharey)

  • nrows子图的行数
  • ncols子图的列数
  • sharex 所有子图使用相同的x轴刻度
  • sharey 所有子图使用相同的y轴刻度
from matplotlib import pyplot as plt  
#fig 画布对象    axs子图对象     [0,1]索引 
fig,axs=plt.subplots(2,2,figsize=(12,12),sharex=True,sharey=True)  
axs[0,0].scatter(range(5),range(5)) #[0,0] 选中第一张图
axs[0,1].scatter(range(5),range(5)[::-1])  #[0,1]选中第二张图,并且按照散点y值取反
 #调整图与图之间的间距
plt.subplots_adjust(wspace=0,hspace=0)  
plt.show()  #展示图片

在这里插入图片描述

2.2.2 Matplotlib绘制图形

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

2.2.3 折线图

折线图介绍
折线图以折线的上升或下降来表示统计数量的增减变化的统计图。
特点:能够显示数据的变化趋势,反映事物的变化情况
折线图绘制。
折线图可以通过plot()函数来绘制
• plt.plot(x, y)     # 使用默认的线样式及颜色绘制x,y构建的图形

举例:绘制折线图形

x=[1,2,3,4]  #列表
y=[5,3,4,1]
plt.plot(x,y)  #绘制折线图
plt.show()   #展示图片,释放内存

在这里插入图片描述


并且,plt.plot()函数除了传入制图数据,还可以设置线的颜色等。
• color 设置线的颜色
• linestyle 设置线的样式
• marker 标记样式

import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [5,3,4,1]
plt.plot(x,y,color="y",linestyle="--",marker="*")

plt.show()

在这里插入图片描述

假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形。并且时间刻度为0,0.5…

from matplotlib import pyplot as plt
#设置画布大小
plt.figure(figsize=(14,8))
x=range(0,24,2)
y=[15,13,14.5,17,20,25,26,26,27,22,18,15]

#绘制图形
plt.plot(x,y)


#设置刻度
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)  #rotation=45  旋转45

#设置y刻度
y_t=range(min(y),max(y)+1)
plt.yticks(y_t)

#添加X轴标签
plt.xlabel("time")

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

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

#添加网格
plt.grid()


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

plt.show()

在这里插入图片描述

方法描述
plt.figure(figsize=None,dpi=None)生成新的图片,figsize:图片大小,dpi:透明度
plt.savefig(fname)保存图片
plt.xticks(ticks=None)设置x轴刻度的值
plt.yticks(ticks=None)设置y轴刻度的值
plt.xlabel(xlabel)设置x轴标签
plt.ylabel(ylabel)设置y轴标签
plt.title()设置图标题
plt.grid()根据x轴和y轴的数值展示轴网格

练习1.

获取十点到十二点每一分钟的气温,观察气温变化情况

from matplotlib import pyplot as plt
import random

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


x=range(120)
y = [random.randint(30,38) for i in range(120)]
plt.plot(x,y)


#刻度:0,10,20......
x_t=range(0,120,10)
#刻度标签 为十点0分,十点10分.... 十一点50分
x_l=["十点{}分".format(i) for i in range(0,60,10)]
x_l+=["十一点{}分".format(i) for i in range(0,60,10)]
plt.xticks(x_t,x_l,rotation=45)
plt.show()

在这里插入图片描述

注意:中文显示问题
当我们需要设置轴标签,标题等,通常会使用到中文。但是,matplotlib默认不显示中文。
因此下面有三种解决方法,其中方法一二是matplotlib自带的字体格式为.ttf,是全局变量,不支持.ttc字体。方法三相当于从电脑中注册字体到matplotlib的字体库中(可以导入.ttc或者.ttf的字体,windos会有.ttc字体),是局部变量。

方法一

import matplotlib
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)  # fontproperties=font  需要传参,有点麻烦,优点是可以设置某个图形的局部字体大小
plt.show()

练习2
假设大家在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]

from matplotlib import pyplot as plt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 

x=range(11,31)
ya=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] 
yb=[1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
plt.plot(x,ya,label="自己")
plt.plot(x,yb,label="同桌")
#添加图例
plt.legend()

#设置刻度
x_t=["{}岁".format(x) for x in range(11,31,1)]
plt.xticks(x,x_t,rotation=45)
# y_max=max(ya) if max(ya) > max(yb) else max(yb)
# y_t=["{}个".format(y_max)]

# plt.yticks(y_max,y_t)

#添加注释文本
#实现:每个点都使用上数据标签
#思路:什么在变?对应的参数(坐标)在变
#((11,1) (12,0)
#plt.annotate("1",xy=(11,1),xytext=(11,1)
for m,n in zip(x,ya):
    plt.annotate(f"{n}",xy=(m,n),xytext=(m,n))
for p,q in zip(x,yb):
    plt.annotate(f"{q}",xy=(p,q),xytext=(p,q-0.3))
#也可以定义一个函数,然后调用函数实现功能,比起上面要省略代码。
#def auto(xl,yl):
#    for m,n in zip(xl,yl):
#       plt.annotate(f"{n}",xy=(m,n),xytext=(m,n))
#auto(x,ya)
#auto(x,yb)
plt.xlabel("年龄")
plt.ylabel("个数")
plt.title("朋友变化")
plt.show()

在这里插入图片描述

添加注释文本
plt.annotate() 基本使用

  • text 是注释的文本
  • xy 是需要注释的点的坐标
  • xytext 是注释文本的坐标
  • arrowprops 是箭头的样式属性 (默认格式是字典,比如arrowprops={“width”:2})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值