目录
公众号
效果图
交叉折线图之间分色填充概念介绍
交叉折线图之间的分色填充是一种高级数据可视化技巧,它涉及在两条或多条在一定区间内交叉或重叠的折线图之间应用不同的颜色填充。此技术主要用于图形化地表示两组或多组数据之间的比较和对比,特别是它们随时间或其他变量的变化。
应用领域
-
金融市场分析:展现不同金融工具或指数在时间序列中的表现,突出市场波动或趋势。
-
生物医学研究:比较不同治疗方法或条件下的生物标志物变化。
-
环境监测:可视化不同环境因素(如温度、湿度)随时间的变化及其相互作用。
-
市场调研:对比不同消费群体的购买习惯或品牌偏好随时间的变化。
优点
-
增强数据解释性:通过颜色差异,使得数据集间的比较更加直观和易于理解。
-
强调数据动态:特别适用于展现数据随时间或其他变量的动态变化。
-
视觉吸引力:相比于传统的折线图,颜色填充增加了图表的视觉吸引力,提高了观众的关注度。
缺点
-
颜色选择的重要性:不当的颜色选择可能导致误解或视觉混淆,特别是在色盲观众中。
-
数据解读的准确性:过度依赖颜色填充可能会忽视数据的其他重要方面,如统计显著性。
-
图表复杂性:过多的数据集或颜色可能使图表过于复杂,难以解读。
结论
交叉折线图之间的分色填充通过颜色的视觉对比强化了数据间的差异和关系。正确使用时,它可以有效地传达复杂信息,并帮助观众理解数据动态。然而,为了保持图表的有效性和易读性,需要仔细考虑颜色选择和图表设计。
绘图工具函数
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