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 饼图
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()
2.2 柱状图
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()
2.3 直方图
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()
2.4 散点图
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()
2.5 箱线图(常用来判断异常值)
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()
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()
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()
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()
plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)
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)
plt.show()
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()
不使用日期格式:
使用日期格式:
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()
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()
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()
4. 绘制子图
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()