一、读取excel文件
filename = '你的Excel文件名.xlsx'; % 替换为你的文件名
data = readtable(filename);
1. `filename`: 这是 Excel 文件的名称,需要你手动替换为实际的文件名。
2. `readtable(filename)`: 从 Excel 文件中读取数据并存储在一个表格格式的变量 `data` 中。`readtable` 函数会自动将 Excel 中的数据读取为一个 `table` 数据类型,这种类型方便后续的数据操作。
二、设置保存路径
output_folder = '你的输出文件夹路径'; % 替换为你想保存图像的文件夹路径
if ~exist(output_folder, 'dir')
mkdir(output_folder);
end
1. `output_folder`: 指定图像保存的文件夹路径,需要替换为你想保存图像的实际路径。
2. `if ~exist(output_folder, 'dir')`: 检查指定的输出文件夹是否存在。
3. `mkdir(output_folder)`: 如果文件夹不存在,则创建该文件夹,以便后续保存图像。
三、获取所有用户编号
user_ids = unique(data{:, 1}); % 第一列是用户编号
num_users = length(user_ids);
1. `unique(data{:, 1})`: 提取第一列的用户编号,并去除重复值,得到所有唯一的用户编号。
2. `num_users`: 获取用户编号的总数,用于后续循环遍历。
四、 图形参数设置
plots_per_row = 5; % 每行5个子图
plots_per_figure = 30; % 每个大图包含30个子图
time_ticks = linspace(1, 96, 5); % 计算小时刻度(以5小时为间隔)
time_labels = {'0', '5', '10', '15', '20'}; % 时间刻度标签
1. `plots_per_row = 5`: 每行放置 5 个子图。
2. `plots_per_figure = 30`: 每张大图上显示 30 个子图。
3.`time_ticks = linspace(1, 96, 5)`: 生成 5 个横坐标刻度,范围为 1 到 96(一天内 96 个数据点)。
4. `time_labels = {'0', '5', '10', '15', '20'}`: 定义横坐标的标签,对应每 5 小时一个刻度。
五、 循环绘制每个用户的图
fig_num = 1; % 图编号
plot_num = 1; % 子图编号
1. `fig_num`: 记录当前大图的编号,用于图像文件命名。
2. `plot_num`: 记录当前大图中子图的编号,用于判断是否需要创建新图。
六、获取当前用户编号和数据
for user_index = 1:num_users
user_id = user_ids(user_index);
user_data = data(data{:, 1} == user_id, 7:end); % 从第7列开始是数据点
1. `for user_index = 1:num_users`: 循环遍历每一个用户。
2. `user_id = user_ids(user_index)`: 获取当前循环用户的编号。
3. `user_data = data(data{:, 1} == user_id, 7:end)`: 获取当前用户的数据,取第 7 列及之后的所有列(即 96 个数据点),这是用户每日的功率/容量数据。
user_data_array = table2array(user_data);
4.将 table 转换为数组,适合绘图操作
七、如果是新的一页,创建新图
if plot_num == 1
figure('Units', 'centimeters', 'Position', [0, 0, 20, 30]); % 设定图的大小
end
1. `if plot_num == 1`: 当 `plot_num` 为 1 时,说明要开始创建新的一页大图。
2. `figure('Units', 'centimeters', 'Position', [0, 0, 20, 30])`: 创建一个新的图窗口,尺寸设置为 20cm x 30cm,以厘米为单位。
八、 创建子图
subplot(ceil(plots_per_figure / plots_per_row), plots_per_row, plot_num);
plot(user_data_array', 'LineWidth', 0.5); % 使用数组进行绘图
xlim([1, 96]);
xticks(time_ticks);
xticklabels(time_labels);
xlabel('时间 (小时)');
ylabel('功率');
title(['用户编号:', num2str(user_id)]);
grid on;
1. `subplot(ceil(plots_per_figure / plots_per_row), plots_per_row, plot_num)`: 在当前大图中创建子图,指定行数和列数,以及子图的顺序。
2. `plot(user_data_array', 'LineWidth', 0.5)`: 绘制当前用户的 365 天数据,每条线表示一天的数据。
3. `xlim([1, 96])`: 设置横坐标范围为 1 到 96。
4. `xticks(time_ticks)`: 设置横坐标刻度为 `time_ticks`,对应之前定义的小时刻度。
5. `xticklabels(time_labels)`: 设置横坐标的刻度标签。
6. `xlabel('时间 (小时)')` 和 `ylabel('功率')`: 设置横纵坐标的名称。
7. `title(['用户编号:', num2str(user_id)])`: 给子图添加标题,显示用户编号。
8. `grid on`: 显示网格线。
9.设置子图坐标轴字体大小为 6
% 设置字体大小为 6
set(gca, 'FontSize', 6);
九、 更新子图编号
plot_num = plot_num + 1;
十、当当前图包含30个子图或是最后一个用户时,保存图像
if plot_num > plots_per_figure || user_index == num_users
% 保存图像
saveas(gcf, fullfile(output_folder, ['图像_', num2str(fig_num), '.png']));
close(gcf);
% 重置子图编号和增加图编号
plot_num = 1;
fig_num = fig_num + 1;
end
end
1. `if plot_num > plots_per_figure || user_index == num_users`: 检查当前图是否已经包含 30 个子图或者是否处理到最后一个用户。
2. `saveas(gcf, fullfile(output_folder, ['图像_', num2str(fig_num), '.png']))`: 将当前大图保存为 PNG 格式,文件命名为 `图像_编号.png`。
3. `close(gcf)`: 关闭当前图窗口,释放内存。
4. `plot_num = 1` 和 `fig_num = fig_num + 1`: 重置子图编号,并增加大图编号,准备绘制下一张大图。