MATLAB|交叉折线图之间分色填充

本文介绍了交叉折线图之间分色填充的概念、应用领域、优缺点及如何在MATLAB中实现。该技术用于增强数据可视化,尤其在时间序列分析中对比多组数据。文章提供绘图函数的输入参数和使用方法,并展示多个案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

公众号

效果图

交叉折线图之间分色填充概念介绍

应用领域

优点

缺点

结论

绘图工具函数

函数输入参数:

使用方法

案例 1

​编辑

案例 2

​编辑

案例 3


公众号

效果图

图片

图片

交叉折线图之间分色填充概念介绍

交叉折线图之间的分色填充是一种高级数据可视化技巧,它涉及在两条或多条在一定区间内交叉或重叠的折线图之间应用不同的颜色填充。此技术主要用于图形化地表示两组或多组数据之间的比较和对比,特别是它们随时间或其他变量的变化。

应用领域

  • 金融市场分析:展现不同金融工具或指数在时间序列中的表现,突出市场波动或趋势。

  • 生物医学研究:比较不同治疗方法或条件下的生物标志物变化。

  • 环境监测:可视化不同环境因素(如温度、湿度)随时间的变化及其相互作用。

  • 市场调研:对比不同消费群体的购买习惯或品牌偏好随时间的变化。

优点

  • 增强数据解释性:通过颜色差异,使得数据集间的比较更加直观和易于理解。

  • 强调数据动态:特别适用于展现数据随时间或其他变量的动态变化。

  • 视觉吸引力:相比于传统的折线图,颜色填充增加了图表的视觉吸引力,提高了观众的关注度。

缺点

  • 颜色选择的重要性:不当的颜色选择可能导致误解或视觉混淆,特别是在色盲观众中。

  • 数据解读的准确性:过度依赖颜色填充可能会忽视数据的其他重要方面,如统计显著性。

  • 图表复杂性:过多的数据集或颜色可能使图表过于复杂,难以解读。

结论

交叉折线图之间的分色填充通过颜色的视觉对比强化了数据间的差异和关系。正确使用时,它可以有效地传达复杂信息,并帮助观众理解数据动态。然而,为了保持图表的有效性和易读性,需要仔细考虑颜色选择和图表设计。

绘图工具函数

function fillArea(x1, y1, x2, y2, fillColor1, fillColor2, alphaValue)
%--------------------------------------------------------------------------
% @Author: 好玩的Matlab && 猪猪
% @公众号:好玩的Matlab
% @Created: 09,18,2023
% @Email: 2377389590@qq.com
% 尊重劳动成果,转载请备注推文链接和公众号名,严禁商用。
%--------------------------------------------------------------------------
plot(x1,y1,'color','none','HandleVisibility','off');
plot(x2,y2,'color','none','HandleVisibility','off');
% 调用函数
x1 = x1(:); y1 = y1(:);
x2 = x2(:); y2 = y2(:);
% 查找交点
[xi, yi] = polyxpoly(x1, y1, x2, y2);
% 裁剪到共同的 x 轴范围
xRange = [max(min(x1), min(x2)), min(max(x1), max(x2))];
yRange = [min(min(y1), min(y2)), max(max(y1), max(y2))];
%边界交叉点
[xa1,ya1]=polyxpoly(x1, y1,[xRange(1),xRange(1)],yRange);
[xb1,yb1]=polyxpoly(x1, y1,[xRange(2),xRange(2)],yRange);
[xa2,ya2]=polyxpoly(x2, y2,[xRange(1),xRange(1)],yRange);
[xb2,yb2]=polyxpoly(x2, y2,[xRange(2),xRange(2)],yRange);
% 交叉点
[x1,y1]=insertData(x1, y1, xi, yi);[x2,y2]=insertData(x2, y2, xi, yi);
% 边界点插入
[x1, y1] = insertData(x1, y1, xa1, ya1);[x1, y1] = insertData(x1, y1, xb1, yb1);
[x2, y2] = insertData(x2, y2, xa2, ya2);[x2, y2] = insertData(x2, y2, xb2, yb2);
% 提取范围数据
xNew1 = x1(x1 >= xRange(1) & x1 <= xRange(2));yNew1 = y1(x1 >= xRange(1) & x1 <= xRange(2));
xNew2 = x2(x2 >= xRange(1) & x2 <= xRange(2));yNew2 = y2(x2 >= xRange(1) & x2 <= xRange(2));
[X1, Y1, X2, Y2] = equaLen(xNew1, yNew1, xNew2, yNew2);
disp(char([20844 20247 21495 58 22909 29609 30340 77 97 116 108 97 98]))
hold on
for i = 1:length(X1) - 1
    % 确定填充颜色
    if Y1(i) > Y2(i) || (Y1(i) == Y2(i) && Y1(i+1) > Y2(i+1))
        color = fillColor1;
    else
        color = fillColor2;
    end
    % 填充
    fill([X1(i) X1(i+1) X1(i+1) X1(i)], [Y1(i) Y1(i+1) Y2(i+1) Y2(i)], ...
        color, 'EdgeColor', 'none', 'FaceAlpha', alphaValue, 'HandleVisibility', 'off');
end
    function [x1, y1, x2, y2] = equaLen(x1, y1, x2, y2)
        % 确保两个多边形具有相同数量的点
        % 同时保留原有的数据点
        % 确定 x 的范围和新的 x 网格
        xMin = min(min(x1), min(x2));
        xMax = max(max(x1), max(x2));
        % 生成一个包含所有原始 x 值的合并且排序的数组
        xAll = unique([x1; x2]);
        % 如果合并后的 xAll 长度小于两个数据集中最长的长度
        % 则在 xAll 中插入额外的点以匹配最长的数据集长度
        maxLength = max(length(x1), length(x2));
        if length(xAll) < maxLength
            additionalPoints = linspace(xMin, xMax, maxLength - length(xAll) + 2);
            xAll = unique([xAll; additionalPoints(:)]);
        end
        % 插值
        y1 = interp1(x1, y1, xAll, 'linear', 'extrap');
        y2 = interp1(x2, y2, xAll, 'linear', 'extrap');
        % 更新 x1 和 x2
        x1 = xAll;
        x2 = xAll;
    end
    function [xUpdated, yUpdated] = insertData(xMain, yMain, xInsert, yInsert)
        % 将 xInsert 和 yInsert 中的数据插入到 xMain 和 yMain 中
        % 并确保结果是唯一的并且按照 x 的值排序
        % 组合 xMain 和 xInsert
        xCombined = [xMain; xInsert];
        % 组合 yMain 和 yInsert
        yCombined = [yMain; yInsert];
        % 获取唯一的 x 值及其索引,并保持排序
        [xUnique, idxUnique] = unique(xCombined, 'sorted');
        % 使用这些索引过滤 yCombined
        yUnique = yCombined(idxUnique);
        % 返回更新后的 x 和 y
        xUpdated = xUnique;
        yUpdated = yUnique;
    end
end

函数输入参数:

  • x1, y1, x2, y2: 这些参数分别代表两条曲线的 x 和 y 坐标值。

  • fillColor1, fillColor2: 用于填充的两种颜色。

  • alphaValue: 填充颜色的透明度。

使用方法

案例 1


clc;clear;close all;
x1=pi:0.02:2*pi;
x2=0:0.1:3*pi;
y1=sin(10*x1);
y2=cos(x2);
% 定义填充颜色
fillColor1 = 'r'; 
fillColor2 = 'g'; 
alphaValue=0.3;
fillArea(x1, y1, x2, y2, fillColor1, fillColor2, alphaValue);
plot(x1,y1,'-k','LineWidth',1.5);
plot(x2,y2,'-k','LineWidth',1.5);
ax=gca;
ax.LineWidth=1.5;
ax.FontName='Times new Roman';
ax.FontSize=16;
ax.Box='off';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.TickDir='out';
ax.GridLineStyle='-.';
ax.YGrid='on';
ax.XGrid='on';
ax.YMinorGrid='off';
ax.XMinorGrid='off';
ax.MinorGridLineStyle=':';
ax.YLim=[-2,2];

案例 2


clc;clear;close all;
x1=0:0.1:pi/2;
x2=0:0.1:pi/2;
y1=x1;
y2=x2.^2;
fillColor1 = [0.6953, 0.9961, 0.9961]; 
fillColor2 = [0.9961, 0.6992, 0.9961];
alphaValue = 0.9;

fillArea(x1,y1,x2,y2,fillColor1,fillColor2,alphaValue)
plot(x1,y1,'-k');
plot(x2,y2,'-k');

ax=gca;
ax.LineWidth=1.5;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
ax.FontName='Times new Roman';
ax.FontSize=16;
ax.Box='off';
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.TickDir='out';
ax.GridLineStyle='-.';
ax.YGrid='on';
ax.XGrid='on';
ax.YMinorGrid='off';
ax.XMinorGrid='off';
ax.MinorGridLineStyle=':';
ax.YLim=[-0.5,2.5];

案例 3

clc; clear; close all;
% 读取数据:
T = readtable("Book7.xls", 'VariableNamingRule', 'preserve'); % 基准数据
data = table2array(T(:,2:3));
x = (1:length(data))';  % 确保x是列向量
x1=x;x2=x;
y1 = data(:,1);
y2 = data(:,2);

% 绘制基本曲线和填充区域
% 定义填充颜色
fillColor1 = [0.6953, 0.9961, 0.9961]; % 浅蓝色
fillColor2 = [0.9961, 0.6992, 0.9961]; % 浅紫色
% 定义透明度
alphaValue = 0.9;
% 调用函数
figure
fillArea(x1, y1, x2, y2, fillColor1, fillColor2, alphaValue);
plot(x1, y1, 'b','HandleVisibility','off');
plot(x2, y2, 'r','LineWidth',1.5);
defaultAxis(x)

figure
fillArea(x1(120:260), y1(120:260), x2, y2, fillColor1, fillColor2, alphaValue);
plot(x1, y1, 'b','HandleVisibility','off');
plot(x2, y2, 'r','LineWidth',1.5);
defaultAxis(x)
function defaultAxis(x)
ax=gca;
ax.LineWidth=1.5;
ax.FontName='Times new Roman';
ax.FontSize=16;
ax.Box='off';
ax.XMinorTick='off';
ax.YMinorTick='on';
ax.TickDir='out';
ax.YGrid='on';
ax.GridLineStyle='-.';
ax.YMinorGrid='on';
ax.MinorGridLineStyle=':';

ax.XTick=linspace(0,length(x),8);
ax.XTickLabel=arrayfun(@num2str, 2006:1:2013, 'UniformOutput', false);
ax.YTick=6000:2000:16000;
ax.YTickLabel=arrayfun(@num2str, 6000:2000:16000, 'UniformOutput', false);

mainTicks = ax.YTick;
minorTicks = mainTicks(1:end-1) + diff(mainTicks) / 2;
ax.YAxis.MinorTickValues = minorTicks;
ax.Title.String='Dow Jones Industrial Average from 0ct.2006 to Aug.2013';
legend('1 year moving average','Location','southeast')
end

原文参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

好玩的Matlab(NCEPU)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值