分享昨天用Matlab写的plotArrowTrend箭头函数

4.7
(3)

在科学和工程领域,可视化是理解数据和趋势的关键步骤之一。为了更直观地展示函数曲线的趋势,我编写了一个MATLAB函数:plotArrowTrend。该函数通过在曲线上定期添加箭头,以表示曲线的方向,从而使趋势更加明显。

分享昨天用Matlab写的plotArrowTrend箭头函数

1. 函数代码

function plotArrowTrend(x, y, arrow_spacing, arrow_translation_y, arrow_length)
% plotArrowTrend 函数
% 该函数用于绘制带有箭头的趋势曲线,以更直观地表示曲线的方向变化。
%
% 使用方式:
% plotArrowTrend(x, y, arrow_spacing, arrow_translation_y, arrow_length);
%
% 参数说明:
%   x: 函数的自变量,如时间或空间坐标。
%   y: 函数的因变量,对应于自变量 x。
%   arrow_spacing: 控制箭头之间的间隔,以在曲线上均匀插入箭头。
%   arrow_translation_y: 控制箭头在y轴上的垂直平移,以更好地对齐于曲线。
%   arrow_length: 箭头的长度,用于表示曲线的方向。
%
% 示例:
% x = linspace(0, 10, 50);
% y = sin(x);
% arrow_spacing = 2;
% arrow_translation_y = 0.5;
% arrow_length = 0.1;
% plotArrowTrend(x, y, arrow_spacing, arrow_translation_y, arrow_length);
%
% 注意事项:
% - 请确保输入的 x 和 y 向量具有相同的长度。
% - arrow_spacing 的取值应适当,过大可能导致箭头过密,过小可能影响可视效果。
% - arrow_translation_y 可以为正或负值,以调整箭头在曲线上方或下方的位置。
% - arrow_length 控制箭头的实际长度,可以根据需求调整。
%
% 函数输出:
% 该函数没有显式的输出,而是在当前图形中绘制带有箭头的趋势曲线。
%
% 更多信息:
% 有关函数内部实现的详细信息,请查看函数代码及相关注释。
%
% 作者:
% gugechor

% 绘制曲线
plot(x, y);
hold on;
% 计算箭头的位置和方向
arrow_x = x(1:arrow_spacing:end-arrow_spacing);
arrow_y = y(1:arrow_spacing:end-arrow_spacing) + arrow_translation_y;
% 计算曲线的切线方向
dy_dx = gradient(y, x);
% 将箭头的起始点平移一定距离
arrow_x_start = arrow_x;
arrow_y_start = arrow_y;
% 绘制箭头
for i = 1:length(arrow_x_start)
    % 根据箭头长度和曲线切线方向设置箭头的终止点
    angle = atan(dy_dx(arrow_spacing * (i - 1) + 1));
    arrow_x_end = arrow_x_start(i) + arrow_length * cos(angle);
    arrow_y_end = arrow_y_start(i) + arrow_length * sin(angle);
    plot([arrow_x_start(i), arrow_x_end], [arrow_y_start(i), arrow_y_end], 'r');
    % 在箭头末尾添加夹角为15°的两个短线段,模拟箭头
    delta_angle = pi/12; % 15度对应的弧度值
    angle1 = angle + delta_angle;
    angle2 = angle - delta_angle;
    line_length = 0.05; % 调整这个值以控制箭头短线段的长度
    dx1 = line_length * cos(angle1);
    dy1 = line_length * sin(angle1);
    dx2 = line_length * cos(angle2);
    dy2 = line_length * sin(angle2);
    plot(arrow_x_end, arrow_y_end, 'r', 'LineWidth', 2);
    plot([arrow_x_end, arrow_x_end - dx1], [arrow_y_end, arrow_y_end - dy1], 'r', 'LineWidth', 1);
    plot([arrow_x_end, arrow_x_end - dx2], [arrow_y_end, arrow_y_end - dy2], 'r', 'LineWidth', 1);
end
hold off;
% 添加标签和标题等其他元素
xlabel('X轴');
ylabel('Y轴');
title('带有箭头的趋势曲线');
end

2. 函数参数详解

2.1 输入参数

  • x, y:
    • x为函数的自变量,y为相应的因变量,用于绘制曲线。
  • arrow_spacing:
    • 定义箭头之间的间隔,以便在曲线上均匀地插入箭头。
  • arrow_translation_y:
    • 控制箭头的垂直平移,使箭头位于曲线上方或下方,以更好地展示趋势。
  • arrow_length:
    • 箭头的长度,用于表示曲线的方向。

2.2 内部计算

  • arrow_x, arrow_y:
    • 计算箭头的位置,以及添加垂直平移后的坐标。
  • dy_dx:
    • 利用梯度函数计算曲线的切线方向。

3. 绘制箭头及相关细节

3.1 平移箭头起始点

箭头的起始点通过在y轴上平移一定距离(arrow_translation_y)得到,以更好地对齐于曲线。

3.2 绘制箭头

利用曲线切线方向和箭头长度,计算箭头的终止点,并通过MATLAB的plot函数绘制箭头。

3.3 模拟箭头形状

在箭头的终止点添加夹角为15°的两个短线段,模拟箭头形状,增强可视效果。

3.4 调整箭头短线段的长度

通过调整line_length参数,用户可以灵活控制箭头短线段的长度,以适应不同的图形比例和需求。

4.函数用法

x = linspace(0, 10, 50);
y = sin(x);


arrow_spacing = 2;
arrow_translation_y = 0.5;
arrow_length = 0.1;

plotArrowTrend(x, y, arrow_spacing, arrow_translation_y, arrow_length);

运行结果如下:

分享昨天用Matlab写的plotArrowTrend箭头函数

当然也可以不用函数做曲线,y值也可以输入数据,只要跟x一一对应即可。可以通过调节另外三个参数以达到你需要的箭头的样式:arrow_spacing, arrow_translation_y, arrow_length。

plotArrowTrend函数为MATLAB用户提供了一种简便而直观的方式来展示函数曲线的趋势。通过添加箭头,用户可以更容易地理解曲线的方向变化,从而更深入地分析数据。同时,函数的参数设计灵活,使用户能够根据具体需求调整箭头的间隔、垂直位置和长度,以获得最佳的可视效果。在科学研究、工程分析等领域,这个函数都具有广泛的应用前景。

5. quiver函数

此外,你也可以用Matlab内置的quiver箭头函数,不过效果不太理想。其代码如下:

% 创建一些示例数据
x = linspace(0, 10, 500);
y = sin(x);

% 绘制曲线
plot(x, y);
hold on;  % 保持图形以便添加箭头

% 设置箭头之间的间隔、竖直平移的距离和箭头长度
arrow_spacing = 10; % 调整此值以改变间隔
arrow_translation_y = 0.5; % 调整此值以改变竖直平移距离
arrow_length = 5; % 调整此值以改变箭头长度

% 计算箭头的位置和方向
arrow_x = x(1:arrow_spacing:end-10);
arrow_y = y(1:arrow_spacing:end-10);
arrow_dx = diff(x(1:arrow_spacing:end));
arrow_dy = diff(y(1:arrow_spacing:end));

% 将箭头的起始点平移一定距离
arrow_x_start = arrow_x;
arrow_y_start = arrow_y + arrow_translation_y;

% 根据箭头长度设置箭头的终止点
arrow_x_end = arrow_x_start + arrow_length * (arrow_dx./sqrt(arrow_dx.^2 + arrow_dy.^2));
arrow_y_end = arrow_y_start + arrow_length * (arrow_dy./sqrt(arrow_dx.^2 + arrow_dy.^2));

% 绘制箭头
quiver(arrow_x_start, arrow_y_start, arrow_dx, arrow_dy, 0, 'color', 'r', 'AutoScale', 'off');

hold off; % 不再保持图形

% 添加标签和标题等其他元素
xlabel('X轴');
ylabel('Y轴');
title('带有箭头的趋势曲线');

运行结果如下:

分享昨天用Matlab写的plotArrowTrend箭头函数

公众号后台回复:《Matlab箭头函数》即可免费获取本文提供的plotArrowTrend函数。

共计3人评分,平均4.7

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

文章目录

原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/16700.html

(0)
微信公众号
古哥的头像古哥管理团队
上一篇 2023年11月22日 19:40
下一篇 2023年11月23日 17:36

你可能感兴趣的文章

发表回复

登录后才能评论
微信小程序
微信公众号