Python的Matplotlib库是使用最广泛的数据可视化库之一,作为底层绘图工具,可定制性很强,。使用Matplotlib,可以使用各种图表类型绘制数据,包括折线图、条形图、饼图和散点图,可以绘制单个图表和绘制多个图表。
在本专栏里面已详细说明单个图的绘制方法及图片的细节设计,点击链接直达:
Python折线图绘制|含有图片的详细设置
python读取excel中数据并绘制多子图多组图在一张画布上
fig, ax = plt.subplots(x,y,z)
是比较正统的画法(参数x,y,z代表x行y列第z个图),指定figure和axes,然后对axes单独进行操作(图表元素增加和修改)
fig相当于是一个大的画布,ax相当于是小的子图,一个画布可以有一个或多个子图
一旦知道怎么做,就可以绘制多个图了。同样,Matplotlib允许以网格的形式绘制多个图,可以通过一下函数解决
1.使用subplot()函数
2.使用subplots()函数
使用subplot()函数
要使用pyplot模块中的subplot()函数绘制多个绘图,需要执行两个步骤:
导入代码:
import matplotlib.pyplot as plt
首先,需要使用三个参数调用subplot()函数:(1)网格的行数,(2)网格的列数,以及(3)用于绘图的位置或轴,ax = plt.subplots(x,y,z)
,如:subplot(3,1,1)告诉Python解释器,下一个图应该绘制在包含3行和1列的网格中,并且该图应该出现在网格中的第一个位置(第1行,第1列)。绘图位置的顺序首先从左到右,然后从上到下。
在执行subplot()命令之后,只需调用要使用pyplot模块绘图的相应函数或图表类型。例如,下面的脚本使用plot()方法制作折线图,关键点已经说清楚了直接上代码:
# -*- coding: utf-8 -*-
"""
Created on Sat May 6 11:35:21 2023
@author: ypzhao
"""
import pandas as pd
import numpy as np
import xlsxwriter as xw
import matplotlib.pyplot as plt
from PIL import Image
excel = pd.read_excel("C:/Users/ypzhao/Desktop/电机数据/电机参数.xlsx")
data = pd.DataFrame(excel)
t = data['时间']
T1 = data['转矩1']
S1 = data['转速1']
P1 = data['功率1']
T2 = data['转矩2']
S2 = data['转速2']
P2 = data['功率2']
font = {'family': 'Times New Roman','size': 20}
font_1 = {'family': 'Times New Roman','size': 24}
# 画第1个图:折线图
fig, ax1 = plt.subplots(figsize=(12,8),dpi=1200)
# ax1=fig.add_subplot(3,1,1)
# fig.tight_layout()
ax1.plot(t,T1,marker = "",markersize=1,alpha=.8,color='y',
linewidth=1,label='Control',markeredgecolor='green',)
ax1.plot(t,T2,marker = "",markersize=1,alpha=.7,
linewidth=1,label='Uncontrol',markeredgecolor='blue',)
ax1.axis([0, 2100, -250, 750]) #X、Y轴区间
plt.tick_params(labelsize=20)
labels = ax1.get_xticklabels() + ax1.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.rcParams["font.family"] = "Times New Roman" #全图字号新罗马字体
#rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#rcParams['axes.unicode_minus']=False #用来正常显示负号
#或者等价地写为:
#rc('font',family='SimHei') #用来正常显示中文标签
#rc('axes',unicode_minus=False) #用来正常显示负号
plt.legend(ncol=2,frameon=False,prop=font)
# 设置右和上边框是否可见
ax1.spines['right'].set_visible(False)
ax1.spines['top'].set_visible(False)
plt.xlabel('Times/s',font_1)
plt.ylabel('Torque/N·m',font_1)
plt.savefig('转矩图.jpg',dpi=1200) #保存为图片png格式
# 画第2个图:转速与时间的关系图
fig, ax2 = plt.subplots(figsize=(12,8),dpi=1200)
fig.tight_layout()
ax2.plot(t,S1,marker = "",markersize=1,alpha=.8,
linewidth=1,label='Control',markeredgecolor='lightgary',)
ax2.plot(t,S2,marker = "",markersize=1,alpha=.4,color='g',
linewidth=1,label='Uncontrol',markeredgecolor='maroon',)
plt.tick_params(labelsize=20)
labels = ax2.get_xticklabels() + ax2.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.rcParams["font.family"] = "Times New Roman" #全图字号新罗马字体
plt.legend(ncol=2,frameon=False,prop=font)
# 设置右和上边框是否可见
ax2.axis([0, 2100, 0, 3000]) #X、Y轴区间
ax2.spines['right'].set_visible(False)
ax2.spines['top'].set_visible(False)
plt.xlabel('Times/s',font_1)
plt.ylabel('r/min',font_1)
plt.savefig('转速图.jpg',dpi=1200) #保存为图片png格式
# 画第3个图:饼图
fig, ax3 = plt.subplots(figsize=(12,8),dpi=1200)
ax3.plot(t,P1,marker = "",markersize=1,alpha=.8,
linewidth=1,label='Control',markeredgecolor='green',)
ax3.plot(t,P2,marker = "",markersize=1,alpha=.8,
linewidth=1,label='Uncontrol',markeredgecolor='blue',)
ax3.axis([0, 2100, -50, 105]) #X、Y轴区间
plt.tick_params(labelsize=20)
labels = ax3.get_xticklabels() + ax3.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
plt.rcParams["font.family"] = "Times New Roman" #全图字号新罗马字体
plt.legend(ncol=2,frameon=False,prop=font)
# 设置右和上边框是否可见
ax3.spines['right'].set_visible(False)
ax3.spines['top'].set_visible(False)
plt.xlabel('Times/s',font_1)
plt.ylabel('Power/kW',font_1)
plt.savefig('功率.jpg',dpi=1200) #保存为图片png格式
# plt.savefig('电机数据.png',dpi=1200) #保存为图片png格式
# plt.savefig('电机数据.tif',dpi=1200) #保存为图片png格式
# plt.savefig('电机数据.eps',dpi=1200) #保存为图片png格式
# plt.savefig('电机数据.pdf',dpi=1200) #保存为图片png格式
# file_path ='电机数据.jpg'
# # 获取图片大小
# img = Image.open(file_path)
# imgSize = img.size #大小/尺寸
# w = img.width #图片的宽
# h = img.height #图片的高
# f = img.format #图像格式
# img.close
# print(imgSize)
# print(w, h, f)
Python多子图绘制数据及源代码