Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用。
由于Matplotlib是第三方库,所以我们需要安装它才可以使用。注意,Matplotlib3.0要求python3版本才可安装使用。
安装命令:pip install matplotlib
安装可参考官网:https://matplotlib.org/users/installing.html
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能够绘制折线图,散点图,条形图,直方图,饼图等等。
具体可参考:https://matplotlib.org/gallery/index.html
折线图介绍
折线图以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况
折线图可以通过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()
[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()
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()
可以这样实现 ["{}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()
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()
当我们需要设置轴标签,标题等,通常会使用到中文。但是,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()
假设大家在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()
# 假设大家在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()