python3-matplotlib基本使用(以折线图为例)

1、什么是matplotlib

Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用,是数据分析中不可或缺的重要工具之一。
Matplotlib 是 Python 中类似 MATLAB 的绘图工具。MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。
matplotlib 支持的图形 https://matplotlib.org/stable/gallery/index.html

2、基础使用(以下都以折线图为例)

from matplotlib import pyplot as plt  # 绘图导入 pyplot 一般会重命名为plt
# 展示每隔两个小时的温度变化
x = range(2,26,2)  # [2,4,6,8 ... ,22,24]
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# 绘图
plt.plot(x,y)
# 展示图形
plt.show()

在这里插入图片描述
上面图片存在的问题:

  • 图片的大小(想要高清大图)
  • 保存到本地
  • 描述信息,比如x,y轴表示什么
  • 调整刻度的间距
  • 线条的样式(颜色、透明度)
  • 标记出特殊的点(比如最高点,最低点)
  • 给图片加水印,防伪

3、设置图片宽高、分辨率、xy轴刻度、保存图片到本地

from matplotlib import pyplot as plt  # 绘图导入 pyplot 一般会重命名为plt

# 展示每隔两个小时的温度变化
x = range(2,26,2)  # [2,4,6,8 ... ,22,24]
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]

"""
figure 指的是我们画的图
figsize 宽 高
dpi 没英寸多少个点,点多了,放大后不会模糊,有锯齿形
"""
plt.figure(figsize=(20, 8), dpi=80)

# 绘图
plt.plot(x,y)

# 设置x轴刻度
# plt.xticks(x)
xticks_lables = [i/2 for i in range(4, 49)]
# plt.xticks(xticks_lables)
plt.xticks(xticks_lables[::3])  # 太密集了,可以每三个取一个
# 设置y轴刻度
plt.yticks(range(min(y), max(y)+1))
# 设置刻度颜色,设置刻度倾斜等 参考 https://blog.csdn.net/Poul_henry/article/details/82590392

# 保存
# plt.savefig("./sig_size.png")
# plt.savefig("./sig_size.svg")  # 可以保存为svg矢量图格式,放大不会有锯齿

# 展示图形
plt.show()

在这里插入图片描述

4、X,y轴显示字符串并旋转显示

显示10点到12点每分钟气温变化

from matplotlib import pyplot as plt
import random

x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]

plt.figure(figsize=(15, 8), dpi=80)

plt.plot(x,y)

# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]

# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270)  # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60)  # rotation 旋转的度数

yticks_lables = ["{}tem".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60)

plt.show()

在这里插入图片描述

5、X,y轴显示中文并设置字体大小

如果不设置,中文不能正常显示
针对Windows ,字体存放位置 C:\Windows\Fonts
linux/mac可以参考: https://www.bilibili.com/video/BV1hx411d7jb?p=6
也可以参考: https://www.runoob.com/numpy/numpy-matplotlib.html

from matplotlib import pyplot as plt
import random
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)

x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]

plt.figure(figsize=(15, 8), dpi=80)

plt.plot(x,y)

# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]

# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270)  # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60)  # rotation 旋转的度数

yticks_lables = ["{}度".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60,fontproperties=my_font)

plt.show()

在这里插入图片描述

6、设置XY轴和标题的描述信息并绘制网格

from matplotlib import pyplot as plt
import random
from matplotlib import font_manager

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)

x = range(0, 120)
y = [random.randint(20, 35) for i in range(120)]

plt.figure(figsize=(15, 8), dpi=80)

plt.plot(x,y)

# 调整x 轴的刻度
xtick_lables = ["10:{}".format(i) for i in range(60)]
xtick_lables += ["11:{}".format(i) for i in range(60)]

# plt.xticks(list(x)[::3], xtick_lables[::3],rotation=270)  # rotation 旋转的度数
plt.xticks(list(x)[::3], xtick_lables[::3],rotation=60)  # rotation 旋转的度数

yticks_lables = ["{}度".format(i) for i in range(15, 40, 2)]
plt.yticks(range(15, 40, 2), yticks_lables,rotation=60,fontproperties=my_font)

# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(℃)",fontproperties=my_font)
plt.title("10点到12点每分钟的气温变化情况",fontproperties=my_font)

# 绘制网格
plt.grid(alpha=0.9)  # alpha 可以调整透明度,数值越大越清晰

plt.show()

在这里插入图片描述

7、同时绘制出两条折线并添加图例、设置折线颜色,折线样式

from matplotlib import pyplot as plt
from matplotlib import font_manager

"""
a 是自己  b 是同桌
x 轴是年龄  y 轴是女朋友的数量
"""
a = [1,0,2,1,5,2,3,6,9,5,1,2,3,1,2,3,2,1,2,1]
b = [1,3,1,1,2,1,1,1,4,4,4,2,2,2,4,1,1,4,1,2]

x = range(11, 31)

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)

# 设置图形大小
plt.figure(figsize=(15, 8), dpi=80)

# plot 增加 label 和 plt.legend() 可以显示tuli
# plot 增加 color 可以修改 线条颜色
# linestyle  线条风格  linestyle 也适用于绘制网格
# - 实线  -- 虚线  -. 点划线  : 点虚线  "" 留空或者空格无线条
# linewidth  线条粗细
# alpha  透明度
plt.plot(x, a, label="自己", color="orange", linestyle="--", linewidth=3, alpha=0.3)
plt.plot(x, b, label="同桌", color="#FF69B4", linestyle="-.",linewidth=6, alpha=0.6)

# 设置x刻度
xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, xtick_labels, fontproperties=my_font)
plt.yticks(range(0,11))

# 绘制网格 linestyle 也适用于绘制网格
plt.grid(alpha=0.6, linestyle="--")

# 添加图例  prop 显示中文,只有这里是 prop其他地方都是 fontproperties
# loc="upper left" 参数可以修改 图例位置 默认是右上
plt.legend(prop=my_font,loc="upper left")

plt.show()

在这里插入图片描述

8、标记最高(低)点,添加水印

其他 图像添加image水印、图像添加背景 可 参考 https://zhuanlan.zhihu.com/p/390880393

from matplotlib import pyplot as plt
from matplotlib import font_manager

"""
a 是自己  b 是同桌
x 轴是年龄  y 轴是女朋友的数量
"""
a = [1,0,2,1,5,2,3,6,9,5,1,2,3,1,2,3,2,1,2,1]
b = [1,3,1,1,2,1,1,1,4,4,4,2,2,2,4,1,1,4,1,2]

x = range(11, 31)

my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\SIMLI.TTF", size=12)

# 设置图形大小
plt.figure(figsize=(15, 8), dpi=80)

# plot 增加 label 和 plt.legend() 可以显示tuli
# plot 增加 color 可以修改 线条颜色
# linestyle  线条风格  linestyle 也适用于绘制网格
# - 实线  -- 虚线  -. 点划线  : 点虚线  "" 留空或者空格无线条
# linewidth  线条粗细
# alpha  透明度
plt.plot(x, a, label="自己", color="orange", linestyle="--", linewidth=3, alpha=0.3)
plt.plot(x, b, label="同桌", color="#FF69B4", linestyle="-.",linewidth=6, alpha=0.6)

# 设置x刻度
xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, xtick_labels, fontproperties=my_font)
plt.yticks(range(0,11))

# 标价最高点, 标记最高点;注意:x轴和y轴的索引必须相对应
# mark表示圆圈标记,edgecolors表示圆圈的颜色,s表示标记点的大小
# plt.scatter(x[8], a[8], color='b')
plt.scatter(x[8], a[8], color='b', marker='o', edgecolors='r', s=300)

# 添加文本水印  其他 图像添加image水印 图像添加背景 可 参考 https://zhuanlan.zhihu.com/p/390880393
plt.text(
    x=15,  #文本x轴坐标
    y=5,  #文本y轴坐标
    s='hello world',  #文本内容
    rotation=15,  #文字旋转角度
    ha='center',  #x=2.2是文字的左端位置,可选'center', 'right', 'left'
    va=
    'center',  #y=8是文字的低端位置,可选'center', 'top', 'bottom', 'baseline', 'center_baseline'
    alpha=0.5,
    fontdict=dict(
        fontsize=32,
        color='grey',
        family=
        'monospace',  #字体,可选'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'
        weight=
        'light',  #磅值,可选'light', 'normal', 'medium', 'semibold', 'bold', 'heavy', 'black'
    )  #字体属性设置
)

# 绘制网格 linestyle 也适用于绘制网格
plt.grid(alpha=0.6, linestyle="--")

# 添加图例  prop 显示中文,只有这里是 prop其他地方都是 fontproperties
# loc="upper left" 参数可以修改 图例位置 默认是右上
plt.legend(prop=my_font,loc="upper left")

plt.show()

在这里插入图片描述

https://www.bilibili.com/video/BV1hx411d7jb?p=3
https://www.bilibili.com/video/BV1hx411d7jb?p=4
https://www.bilibili.com/video/BV1hx411d7jb?p=5
https://www.bilibili.com/video/BV1hx411d7jb?p=6 设置中文显示
https://www.bilibili.com/video/BV1hx411d7jb?p=7
https://www.bilibili.com/video/BV1hx411d7jb?p=8

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值