论文高级图表绘制(Python语言,局部放大图)

        本文将通过一个具体的示例,展示如何使用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()

 代码解析

  1. 设置中文显示:通过修改plt.rcParams,确保中文字符可以正确显示,同时解决负号显示问题。

  2. 数据读取与处理:使用pandas读取Excel文件,并截取所需的数据行和列。

  3. 图表绘制:创建主图表,并绘制不同模型的曲线。

  4. 局部放大图:使用inset_axes创建一个局部放大图,并在主图表中绘制相同的数据,设置放大区域的范围。

  5. 图表美化:设置图表的标题、坐标轴标签、图例,并调整图表尺寸,取消网格线。

  6. 连接线:使用mark_inset在主图表和局部放大图之间添加连接线,指示放大区域。

效果展示

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程到天明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值