matplotlib基础使用

Matplotlib绘图(import matplotlib.pyplot as plt)

1. plt.plot

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160, facecolor='grey')  # 设置画布

x = np.linspace(0, 10, 100)  # 创建一个等差数列,在区间0-10内取100个点
y = np.sin(x)

plt.plot(x, y, c='red', ls='dotted', label="sin函数")  # 绘图

plt.title('测试x-y sin')  # 设置图片标题

plt.xticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])  # 设置 x 轴坐标刻度
plt.xlabel('x')  # 设置 x 轴说明

plt.yticks([-1, -0.5, 0, 0.5, 1])  # 设置 y 轴坐标刻度
plt.ylabel('y')  # 设置 y 轴说明

plt.grid()  # 设置网格线
plt.text(0, 0.2, "这是一个函数", weight='bold', color='red', fontsize=12)  # 添加文本
plt.legend(loc='best')  # 图例展示,需在绘图时添加 label 属性
plt.axhline(y=0.4, c='b', ls='--', lw=2)  # 添加平行于x轴参考线
plt.axvline(x=5, c='r', ls='--', lw=2)  # 添加平行于y轴参考线

plt.axhspan(ymin=0.3, ymax=0.7, facecolor='red', alpha=0.2)  # 添加平行于 x 轴的参考区域
plt.axvspan(xmin=3, xmax=7, facecolor='blue', alpha=0.2)  # 添加平行于 y 轴的参考区域

plt.show()

在这里插入图片描述

2.基础图形

2.1 饼图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g5p2zOs1-1667121831168)(数据可视化.assets/image-20221027135404656.png)]

import matplotlib.pyplot as plt

x_data = [1004, 2037, 7310, 5061]  # 数据
y_index = ['数据1', '数据2', '数据3', '数据4']  # 数据对应标签

colors = ['red', 'blue', 'green', 'yellow']  # 数据块对应颜色

explode = [0, 0, 0, 0]  # 突出显示权重(距离圆心的距离,半径的倍数)

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160)  # 设置画布

plt.axes(aspect='equal')  # 画正圆

plt.pie(x=x_data, explode=explode, labels=y_index, colors=colors, autopct='%.1f%%', pctdistance=0.5, labeldistance=1.2,
        counterclock=False, wedgeprops={'linewidth': 1.5, 'edgecolor': 'green'},
        textprops={'fontsize': 10, 'color': 'black'})

plt.title("测试饼状图")

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y7WTVwTx-1667121831169)(数据可视化.assets/image-20221027143143352.png)]

2.2 柱状图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WB8ZSyEL-1667121831170)(数据可视化.assets/image-20221027144822638.png)]

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160)  # 设置画布

index = ["数据1", "数据2", "数据3", "数据4"]

values = [20, 30, 10, 40]

plt.bar(x=index, height=values, align='center', color='r')

plt.xlabel("数据标签", labelpad=10)
plt.ylabel("数据值", labelpad=10)
plt.title("柱状图", pad=10)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ll70ul9-1667121831171)(数据可视化.assets/image-20221027144940022.png)]

2.3 直方图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2QOmcqv-1667121831171)(数据可视化.assets/image-20221027144906502.png)]

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160)  # 设置画布

data = [1, 2, 3, 4, 2, 3, 2, 4, 6, 10, 1, 2, 2]

plt.hist(data, bins=len(data), color='r', edgecolor='black', density=True)  # density=True 计算每个数据出现的频率
plt.xlabel("数据")
plt.ylabel("频率")

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh9InsuM-1667121831171)(数据可视化.assets/image-20221027151041542.png)]

2.4 散点图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIoLdh8V-1667121831172)(数据可视化.assets/image-20221027151209883.png)]

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160)  # 设置画布

x = np.linspace(0, 1, 100)
y = np.cos(np.tan(x))

plt.scatter(x, y, color='red', marker='o', s=5)

plt.xlabel("x的值")
plt.ylabel("y的值")

plt.title("x 与 y(cos tan(x))的散点图")

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQmF8NlG-1667121831172)(数据可视化.assets/image-20221027152240826.png)]

2.5 箱线图(常用来判断异常值)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqxaoXr9-1667121831173)(数据可视化.assets/image-20221027152416638.png)]

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号
plt.figure(figsize=(9, 9), dpi=160)  # 设置画布

data = [-1, 2, 3, 4, 9, 4, 5, 3, 2, 3, 3, 4]

"""
patch_artist: 是否填充商品颜色
showmeans: 是否展示均值
boxprops: 箱体属性设置

showfliers: 是否展示离群点(异常数据)
flierprops: 异常点属性设置

meanprops: 均值点属性设置
medianprops: 中位线属性设置
"""
plt.boxplot(x=data, patch_artist=True, showmeans=True, boxprops={'color': 'red', 'facecolor': 'blue'}, showfliers=True,
            flierprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': '5'},
            meanprops={'marker': 'D', 'markerfacecolor': 'yellow', 'markersize': '10'},
            medianprops={'linestyle': '--', 'color': 'orange'})

plt.title("箱线图测试")
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QjWdIp4k-1667121831173)(数据可视化.assets/image-20221027155759111.png)]

2.6 椭圆
import matplotlib.pyplot as plt
from matplotlib import patches
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置支持中文
center = (5, 5)  # 圆心
radius = 3  # 圆半径
width = 5   # 椭圆宽度
height = 3  # 椭圆高度
angle = 0  # 旋转角度

figure, ax = plt.subplots(3, 3)

# 标注
for i in range(3):
    for j in range(3):
        ellipse = patches.Ellipse(center, width=width, height=height, angle=angle * 45)	 # 创建ellipse实例
        ax[i, j].add_patch(ellipse)  # 添加实例

        dx = 4 * round(np.cos(np.pi / 4 * angle), 2)  # 计算箭头X增量
        dy = 4 * round(np.sin(np.pi / 4 * angle), 2)  # 计算箭头Y增量

        ax[i, j].arrow(center[0], center[1], dx=dx, dy=dy, width=0.08)  # 画箭头
        ax[i, j].plot(center[0], center[1], marker='o', markersize=5, markerfacecolor='#000000')  # 画中心
        ax[i, j].set_xlim([0, 10])  # 设置轴范围
        ax[i, j].set_ylim([0, 10])  # 设置轴范围
        ax[i, j].text(center[0], center[1], '中心', fontsize=15)  # 标注中心点
        ax[i, j].set_title(str(angle * 45) + '°')  # 设置标题
        angle += 1

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vr3Vf3aH-1667121831174)(数据可视化.assets/image-20221028144517883.png)]

2.7 等高线

contour:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 50)  # 生成连续数据
y = np.linspace(-3, 3, 50)  # 生成连续数据
X, Y = np.meshgrid(x, y)
# 生成能够在坐标系中形成点阵的数组,这个可以去参考一下别的文章
# https://lixiaoqian.blog.csdn.net/article/details/81532855 这里讲的比较详细
Z = X**2 + Y**2     # 这里将高度设置为x^2+y^2,就能画一个圆形的等高线
C=plt.contour(x, y, Z, [2, 5, 8, 10])  # 画等高线 # 使用plt.contour(X, Y,Z,[2,5,8,10])也是没问题的
plt.clabel(C, inline=True, fontsize=10)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6yeunt0c-1667121831174)(数据可视化.assets/image-20221028151509002.png)]

contourf:

import numpy as np
import matplotlib.pyplot as plt


# 计算x,y坐标对应的高度值
def f(a, b):
    return (1 - a / 2 + a ** 3 + b ** 5) * np.exp(-a ** 2 - b ** 2)


# 生成x,y的数据
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# 把x,y数据生成mesh网格状的数据,因为等高线的显示是在网格的基础上添加上高度值
X, Y = np.meshgrid(x, y)

# 填充等高线
plt.contourf(X, Y, f(X, Y))
# 显示图表
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u9LnRJ3g-1667121831175)(数据可视化.assets/image-20221028153140801.png)]

plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLPdw9ww-1667121831175)(数据可视化.assets/image-20221028153353778.png)]

3. 完善图形设置

3.1 图例和画布的使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpLJIjPj-1667121831175)(数据可视化.assets/image-20221027162944594.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dpzdfyn0-1667121831176)(数据可视化.assets/image-20221027163031250.png)]

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号

"""
设置画布
figsize:画布尺寸
dpi:像素
"""
fig = plt.figure(figsize=(10, 9), dpi=160)

"""
添加图像画布
add_axes([a, b, c, d])
a:代表图像画布左下角距离画布最左边的距离。
b:代表图像画布左下角距离画布最底部的距离。
c:代表图像画布的宽度和高度。
以上距离均为 100% 距离。
"""
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

x = ['数值1', '数值2', '数值3', '数值4', '数值5', '数值6', '数值7', '数值8', '数值9', '数值10', '数值11', '数值12']
y = [-1, -3, 4, 2, 7, -5, 10, 1, 0, 2, -2, 6]

plt.plot(x, y, marker='H', color='g', ls='--', label='x-y')

plt.xlabel('x')
plt.ylabel('y')

"""
rotation:设置坐标轴标签, 并将标签逆时针旋转 45° 排列
fontsize:设置标签字体大小
"""
plt.xticks(x, rotation=45, fontsize=10)

plt.axhline(y=0, c='b', ls='--', lw=2)  # 添加平行于x轴参考线

plt.title('x-y')

"""
添加图例
bbox_to_anchor = [a, b]
a, b 图例在画布上的位置,左下角相对位置(%)
"""
plt.legend(bbox_to_anchor=[0.15, 0.95], ncol=1, frameon=True)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0R0ozD0-1667121831176)(数据可视化.assets/image-20221027170921288.png)]

3.2 处理日期格式
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号

years = ['2001-1-1', '2002-1-1', '2003-1-1', '2004-1-1',
         '2005-1-1', '2006-1-1', '2007-1-1', '2008-1-1', '2009-1-1', '2010-1-1']

data = [2, 5, 7, 3, 1, 5, 9, 9, 2, 6]

years = pd.to_datetime(years, format='%Y-%m-%d', errors='coerce')


ax = plt.gca()  # 获取坐标系
fig = plt.gcf()  # 获取当前图

fig.set_size_inches(9, 9)  # 设置画布大小
date_format = mpl.dates.DateFormatter('%Y-%m-%d')  # 设置日期格式
ax.xaxis.set_major_formatter(date_format)  # 使用日期格式

xlocator = mpl.ticker.LinearLocator(20)  # 设置 x 轴有3个坐标点
ax.xaxis.set_major_locator(xlocator)  # 应用到 x 轴

plt.plot(years, data, color='red')

plt.xticks(rotation=45)  # 使 x 轴标签旋转 45°

plt.show()

不使用日期格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5aQ6yB5E-1667121831177)(数据可视化.assets/image-20221028093902545.png)]

使用日期格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NsiZcqKe-1667121831177)(数据可视化.assets/image-20221028094248683.png)]

3.3 向图形添加内容

在图像上添加箭头(使用3.1代码)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号

"""
获取当前图像并设置
figsize:画布尺寸
dpi:像素
"""
fig = plt.figure(figsize=(10, 9), dpi=160)

"""
添加子图(坐标系)
add_axes([a, b, c, d])
a:代表图像画布左下角距离画布最左边的距离。
b:代表图像画布左下角距离画布最底部的距离。
c:代表图像画布的宽度和高度。
以上距离均为 100% 距离。
"""
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

x = ['数值1', '数值2', '数值3', '数值4', '数值5', '数值6', '数值7', '数值8', '数值9', '数值10', '数值11', '数值12']
y = [-1, -3, 4, 2, 7, -5, 10, 1, 0, 2, -2, 6]

plt.plot(x, y, marker='H', color='g', ls='--', label='x-y')

plt.xlabel('x')
plt.ylabel('y')

"""
rotation:设置坐标轴标签, 并将标签逆时针旋转 45° 排列
fontsize:设置标签字体大小
"""
plt.xticks(x, rotation=45, fontsize=10)

plt.axhline(y=0, c='b', ls='--', lw=2)  # 添加平行于x轴参考线

plt.title('x-y')

"""
添加图例
bbox_to_anchor = [a, b]
a, b 图例在画布上的位置,左下角相对位置(%)
"""
plt.legend(bbox_to_anchor=[0.15, 0.95], ncol=1, frameon=True)

"""
在图像上添加箭头指向说明
xy: 箭头指向的点坐标
xytext: 文本位置坐标,以左下角为标准计算
weight: 文本字体
color: 文本颜色
arrowprops: 箭头设置
    arrowstyle: 箭头风格
    connectionstyle: 连接样式
    color: 颜色
"""
plt.annotate("最大值", xy=(6, 10), xytext=(8, 10), weight='bold', color='black', arrowprops=dict(
    arrowstyle='->', connectionstyle='arc3', color='red'
))

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rP9FhpP-1667121831177)(数据可视化.assets/image-20221028095634810.png)]

3.4 绘制双坐标轴
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号

index = np.linspace(1, 10, 100)
data1 = np.sin(index)
data2 = np.cos(index)

fig = plt.figure()  # 创建画布
ax1 = fig.add_subplot(111)  # 创建坐标轴, 1行1列
ax1.plot(index, data1, label="主坐标轴", color='red')
ax1.set_ylabel("主坐标轴")
plt.legend(loc='upper right')

ax2 = ax1.twinx()  # 创建次坐标系,且与主坐标系共享 x 轴
ax2.plot(index, data2, label="次坐标轴", color='green')
ax2.set_ylabel("次坐标轴")
plt.legend(loc='upper center')

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jMntexLs-1667121831178)(数据可视化.assets/image-20221028102555655.png)]

3.5 绘制双图
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 显示正负号

index = np.linspace(1, 10, 100)
data1 = np.sin(index)
data2 = np.cos(index)

fig = plt.figure(figsize=(16, 12))  # 创建画布

plt.subplot(121)  # 1行2列的图1
plt.plot(index, data1, ls=':', color='red')

plt.subplot(122)  # 1行2列的图2
plt.plot(index, data2, ls=':', color='green')

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d9FqBi9X-1667121831178)(数据可视化.assets/image-20221028103728576.png)]

4. 绘制子图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3Qz02EU-1667121831179)(数据可视化.assets/image-20221028103939306.png)]

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(16, 9))

x = np.linspace(1, 3, 100)

"""
(2, 3) 将画布划分为 2 行 3 列
(0, 0) 图像的起始画布区域,此处为 0 行 0 列
colspan: 图像跨越的列数
rowspan: 图像跨越的行数
"""
# 子图1
plt.subplot2grid((2, 3), (0, 0), colspan=1, rowspan=2)
y1 = np.sin(x)
plt.plot(x, y1)

# 子图2
plt.subplot2grid((2, 3), (0, 1), colspan=2, rowspan=1)
y2 = np.cos(x)
plt.plot(x, y2)

# 子图3
plt.subplot2grid((2, 3), (1, 1), colspan=2, rowspan=1)
y3 = np.tan(x)
plt.plot(x, y3)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYNneaJf-1667121831179)(数据可视化.assets/image-20221028104908807.png)]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐先生没洗头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值