本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图:
环境准备
首先,确保你的Python环境中已经安装了以下库:
pandas
:用于数据处理和分析。matplotlib
:用于绘制图表。mpl_toolkits
:Matplotlib的一个扩展包,提供了一些额外的布局选项。
如果尚未安装,可以通过以下命令进行安装:
pip install pandas matplotlib
数据准备
需要将要绘制的曲线图的数据存入一个xls文件中。按列存放,每列为一种数据。
以笔者自己的数据为例,保存在一个名为duiwu2.xls的文件中,前七列,每列为一种数据。
代码实现
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题
# 从excel文件读取数据
data = pd.read_excel('duiwu2.xls')
# 截取数据的80-180行
data = data.iloc[80:180, :]
# 提取各列数据
true_values = data.iloc[:, 0]
lstm_values = data.iloc[:, 1]
gru_values = data.iloc[:, 2]
double_lstm_values = data.iloc[:, 3]
double_gru_values = data.iloc[:, 4]
gru_lstm_fc_values = data.iloc[:, 5]
paper_network_values = data.iloc[:, 6]
# 创建曲线图
x = [i * 0.01 for i in range(len(data))] # 生成横坐标值,每0.01为一个单位
fig, ax = plt.subplots()
ax.plot(x, true_values, color='r', label='详细模型', linewidth=1.5)
ax.plot(x, lstm_values, color='b', label='单层LSTM', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
ax.plot(x, gru_values, color='g', label='单层GRU', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
ax.plot(x, double_lstm_values, color='c', label='双层LSTM', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
ax.plot(x, double_gru_values, color='m', label='双层GRU', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
ax.plot(x, gru_lstm_fc_values, color='y', label='GRU-LSTM-FC', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
ax.plot(x, paper_network_values, color='k', label='本文模型', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
# 设置纵坐标范围
ax.set_ylim(-0.6, 0.2)
# 设置横坐标范围
ax.set_xlim(0.8, 1.80)
# 添加标题和坐标轴标签
ax.set_title('不同模型建模效果对比(无功功率)')
ax.set_xlabel('时间(t/s)')
ax.set_ylabel('无功功率(标幺值)')
# 添加图例
ax.legend()
# 调整图表尺寸
fig.set_size_inches(10, 6)
# 取消网格线
ax.grid(False)
# 实现局部放大效果
axins = inset_axes(ax, width="30%", height="40%", loc='upper right') # 根据需要调整大小和位置
# 绘制局部放大图
axins.plot(x, true_values, color='r', label='详细模型', linewidth=1.5)
axins.plot(x, lstm_values, color='b', label='单层LSTM', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
axins.plot(x, gru_values, color='g', label='单层GRU', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
axins.plot(x, double_lstm_values, color='c', label='双层LSTM', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
axins.plot(x, double_gru_values, color='m', label='双层GRU', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
axins.plot(x, gru_lstm_fc_values, color='y', label='GRU-LSTM-FC', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
axins.plot(x, paper_network_values, color='k', label='本文模型', linestyle=(0, (3, 1, 1, 1, 1, 1)), linewidth=2)
# 设定放大区域
x1, x2, y1, y2 = 0.95, 1.1, -0.1, 0.15
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
# 添加连接线
mark_inset(ax, axins, loc1=3, loc2=1, fc="none", ec='0.5')
plt.show()
代码解析
-
设置中文显示:通过修改
plt.rcParams
,确保中文字符可以正确显示,同时解决负号显示问题。 -
数据读取与处理:使用pandas读取Excel文件,并截取所需的数据行和列。
-
图表绘制:创建主图表,并绘制不同模型的曲线。
-
局部放大图:使用
inset_axes
创建一个局部放大图,并在主图表中绘制相同的数据,设置放大区域的范围。 -
图表美化:设置图表的标题、坐标轴标签、图例,并调整图表尺寸,取消网格线。
-
连接线:使用
mark_inset
在主图表和局部放大图之间添加连接线,指示放大区域。