Python读取excel数据绘制多个子图并单独显示

 Python的Matplotlib库是使用最广泛的数据可视化库之一,作为底层绘图工具,可定制性很强,。使用Matplotlib,可以使用各种图表类型绘制数据,包括折线图、条形图、饼图和散点图,可以绘制单个图表和绘制多个图表。

绘制单个图

在本专栏里面已详细说明单个图的绘制方法及图片的细节设计,点击链接直达:

Python折线图绘制|含有图片的详细设置

绘制多个子图并显示在一张画布上

python读取excel中数据并绘制多子图多组图在一张画布上

fig和axis的区别

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)

运行结果 

4fe5090a972049158b4df7a63873447f.jpeg

8bee0989c72245e981c2c37ec20219b7.jpeg

源数据及代码领取链接:

Python多子图绘制数据及源代码 

猜你喜欢

转载自blog.csdn.net/m0_58857684/article/details/130605058