|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
! V* \; g# z/ `
jqsvxcaot306405173527.jpg
2 Q1 K8 [4 I: `0 E好玩的matlab' e9 P, U; z _7 c8 O3 f
带你解锁不一样的matlab新玩法
9 y1 n& L. o* V) T( R
% b7 G& i$ k X! f# l- W今天介绍一下交叉折现之间的分色填充,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】: g6 D# @ n4 k* C0 d6 Q* N
效果图. F; K8 m& z Z2 s0 T
eflurappgkj6405173627.png
5 X. A% s: r: s! g7 O$ E6 o
. G6 G) S! C2 \! l) X) o2 A
akvsy4qogxe6405173727.gif
* K C2 h0 Z: p$ L" ]0 V0 U( U3 G$ T2 v交叉折线图之间分色填充概念介绍交叉折线图之间的分色填充是一种高级数据可视化技巧,它涉及在两条或多条在一定区间内交叉或重叠的折线图之间应用不同的颜色填充。此技术主要用于图形化地表示两组或多组数据之间的比较和对比,特别是它们随时间或其他变量的变化。应用领域金融市场分析:展现不同金融工具或指数在时间序列中的表现,突出市场波动或趋势。3 D, v+ y/ C* _* [' {
生物医学研究:比较不同治疗方法或条件下的生物标志物变化。6 v# Y: ^* a& q R( g
环境监测:可视化不同环境因素(如温度、湿度)随时间的变化及其相互作用。
& A# l: S/ Y1 Z: e* @市场调研:对比不同消费群体的购买习惯或品牌偏好随时间的变化。
. [( \) \% [ x1 e' O! X, M& }优点增强数据解释性:通过颜色差异,使得数据集间的比较更加直观和易于理解。
: n, Y/ G2 i! f) g# A# l5 d- G强调数据动态:特别适用于展现数据随时间或其他变量的动态变化。* I7 n* S& ~- H% p) a/ H
视觉吸引力:相比于传统的折线图,颜色填充增加了图表的视觉吸引力,提高了观众的关注度。
( {4 E, m! V l缺点颜色选择的重要性:不当的颜色选择可能导致误解或视觉混淆,特别是在色盲观众中。
. J j: V/ G% X0 L* X数据解读的准确性:过度依赖颜色填充可能会忽视数据的其他重要方面,如统计显著性。
) Q1 ~+ { ~% J& v' L图表复杂性:过多的数据集或颜色可能使图表过于复杂,难以解读。
+ s& Y& D+ p' R: d3 T+ d结论交叉折线图之间的分色填充通过颜色的视觉对比强化了数据间的差异和关系。正确使用时,它可以有效地传达复杂信息,并帮助观众理解数据动态。然而,为了保持图表的有效性和易读性,需要仔细考虑颜色选择和图表设计。3 n/ `# }0 i3 e# z- E
绘图工具函数fillArea收藏、点赞=学会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 2));yNew1 = y1(x1 >= xRange(1) & x1 2));xNew2 = x2(x2 >= xRange(1) & x2 2));yNew2 = y2(x2 >= xRange(1) & x2 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 onfor 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) 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; endend* m1 V0 r& K+ o
函数输入参数:x1, y1, x2, y2: 这些参数分别代表两条曲线的 x 和 y 坐标值。fillColor1, fillColor2: 用于填充的两种颜色。alphaValue: 填充颜色的透明度。使用方法案例 1
0 p, [( ^, e2 s) G" _- Jclc;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];4 u* b3 y! E9 B% s/ v8 Z
s2tf1cjk20j6405173827.png
0 L% a2 z8 C L4 J8 `% i/ G5 H6 J案例 2clc;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;+ v/ x" c& G& {
fillArea(x1,y1,x2,y2,fillColor1,fillColor2,alphaValue)plot(x1,y1,'-k');plot(x2,y2,'-k');
8 E( |6 s- A: f8 uax=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 I3 q7 n2 w
x5pxlco4gnh6405173928.png
% H2 a* }& z D2 `: G案例 3! t5 T. E, r( |/ Y% ]! d7 ?
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);' w3 S+ G' x. I# i3 a/ p) ~
% 绘制基本曲线和填充区域% 定义填充颜色fillColor1 = [0.6953, 0.9961, 0.9961]; % 浅蓝色fillColor2 = [0.9961, 0.6992, 0.9961]; % 浅紫色% 定义透明度alphaValue = 0.9;% 调用函数figurefillArea(x1, y1, x2, y2, fillColor1, fillColor2, alphaValue);plot(x1, y1, 'b','HandleVisibility','off');plot(x2, y2, 'r','LineWidth',1.5);defaultAxis(x)
9 y1 q7 q& B" ?2 l% FfigurefillArea(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=':';- L" y" j- [& h5 Y& b5 B! P% n
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);; D, B& z# ?3 q# [! K9 [
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
- O4 i9 h9 B* i# Z1 M
5q50ojsi23f6405174028.png
. w/ s7 F3 T$ l! N* K
2 J, _+ Q: D; H: ~4 T; m1 ?
supiwpyep1e6405174128.png
; g7 O8 h2 }* t1 c& U; E1 K5 S4 ]8 H2 _4 I5 R+ b( O
- -THE END- -3 j. U3 h! W" t, ~* ?3 h9 s- p, L
+ o# _5 K' _+ y6 s c" t6 r
源码下载:gitee下载:https://gitee.com/iDMatlab/fillArea3 G/ D) i* F p+ ~; F0 r' I4 n1 [& o1 V
d2q1uprn2fz6405174228.png
2 ?3 p+ }. y) l1 x$ k) c
QQ 群下载:
+ W4 S" ]; R! _. \9 W8 h" s, Y3 {
ue24wupufst6405174328.png
$ F* P$ P0 Q* Zfileexchange 下载:
4 Z" t9 e1 ^% f! _
ghee5smsi0f6405174428.png
7 W F0 B! [0 v/ }- x
$ A3 _1 _9 e( S- {- O* M' i @
参考资料:
& Y; Y; c1 ~5 p1 w# r8 W【1】数据来源 origin 的 Learning Center【2】https://www.zhihu.com/question/37634273/answer/2317006768
5 s. U8 ]1 s* T+ H4 T. F6 A3 N& [, `
u0cc2g3csxe6405174528.gif
1 b0 M6 W6 {' c; X
zgeq4kpwqoj6405174628.png
. S0 U* d7 a4 G) {! t- l: j
送书活动
+ E4 \$ M- q6 X9 @4 R
xmxjj0yuofx6405174728.png
4 J& T5 R9 m H2 \6 \1 X: N V( m# E# g5 ?
nz1kj3odlce6405174828.gif
0 L, z9 j' t8 L8 }! g
3 n1 P( q' e; M( k7 Y& l( p+ O包邮赠送 「北京大学出版社」赞助《AI时代程序员开发之道》本书AI时代程序员开发之道:知识精进+重点解析+上机实训+综合实战+ChatGPT应用,零基础入门,让程序员插上翅膀高效开发!
2 W0 j/ N5 I5 ~: W4 M' v& K
pinjygcxq416405174929.png
Q& X3 j# r+ n2 o. u0 u) P7 \
了解更多
- G% z& @* d: Y2 B+ O▼▼▼
# Y/ n# k, x# f$ k$ h# o5 Y4 N
tjj0gbrmoyq6405175029.jpg
5 } W1 c9 l- R; R+ y% x9 R4 t m. G( h6 L# l h& z
【抽奖方式及满足条件】:0 }* H9 P8 X. p. R3 B! Z( f% [
1.关注「好玩的MATLAB 」公众号和视频号
z/ i1 _. C8 r, t3 p
aoysmjxeopq6405175129.jpg
8 ^) r) `. u/ W/ m$ ?- ?( w2.给本文点【赞】+【在看】;
8 g5 f/ g3 _6 Y& S$ j3.留言区评论点赞最多的前3名。
6 d( Y1 ~7 Q" \% P% d4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。
8 g' Z1 D- K$ B" g) z* f! v同时满足上述4个条件的读者朋友,包邮赠送一本。
, S# H+ p; ] D p1 d1 W【开奖时间】:2023年11月27日中午12点
( S$ Z/ t7 X/ z& s: A# F; e【领奖方式】:在开奖时加小编私人微信:idmatlab
- b& V7 U) r0 Z* V: E扫一扫加管理员微信
/ i# f) r$ O0 \" c4 a4 n
fvrbbvajzmy6405175229.png
7 y; Z0 z" \- ~0 j
epxloucf5ox6405175329.jpg
|
|