点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
2 Z2 _6 {! j* S; Z
32otahxrxgs6405175433.jpg
; H4 | y' D5 o2 M! c! V* X o8 Z
好玩的matlab1 s& T2 n( ^' P# R
带你解锁不一样的matlab新玩法. I" h$ C8 ~2 X! A/ d+ g' o
4 [" y: R! ^+ |7 h( f
今天介绍一下山脊图,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】上周去逛了一下商店看见一个笔架. v% w4 w" R( y) A* C5 a# k6 c
a3wggkgglwp6405175533.png
9 j3 i/ d- |# {% e# y: { S
这突然让我想起,这个不就像科研绘图的山脊图嘛,于是我打算用 MATLAB 复刻一个。6 M3 X5 U- D; P! k$ o2 Q( B! V
otz50lo2iqd6405175634.png
% Z0 \2 [6 G' o) E& ?" K( I) o$ k0 q; j4 a% W1 u: Y
效果图6 x4 s: ~ R. \4 H" J. ?1 r% X& y
uymxoqybko56405175734.png
. x: ]& J7 ]2 E- A
: ]8 W* W% |: P2 m0 K
o4hsuifcm1w6405175834.gif
+ v5 z. i+ v/ ]. E- ^6 L+ Z
山脊图介绍山脊图(Ridge Plot),也被称为Joy Plot,是一种用于可视化数据分布的图表,特别是用于显示多个组的分布情况。在这种图表中,每个组的数据分布都通过平滑的密度曲线来表示,这些曲线沿着垂直轴堆叠,形成类似山脊的视觉效果。山脊图是核密度估计(KDE)的一个应用,它提供了比传统的条形图或直方图更平滑的数据分布视图。+ B- A7 K- w- J
用途:山脊图主要用于展示和比较不同组或类别内数据的分布情况。它特别适合于以下情境:
$ g- [$ ~/ B, {: U3 K6 r1 O5 q比较多个分布:当需要展示和比较多组数据的分布形状时,山脊图能够直观地展示出分布之间的差异。0 g3 k$ z( |8 A% e
展现趋势变化:在时间序列数据中,山脊图可以用来展示数据随时间的变化趋势。
+ z, }+ @7 W% _4 U; y3 v! R$ L优化空间利用:通过堆叠的方式,山脊图能在有限的空间内展示大量的分布信息。: I) }- {" T: f5 y# T5 _
缺点:' H3 h+ K& V$ N, y5 c
可读性:对于不熟悉这种图表的观众来说,山脊图可能难以理解和解读。
; L4 ^$ i/ s* R叠加问题:当曲线重叠较多时,可能会导致图表的某些部分难以区分。4 @3 b% u( N& K: u& S. s
数据量限制:对于数据量非常大的数据集,山脊图可能不那么有效,因为过多的曲线会使图表变得杂乱。; u+ x5 E; R' W
应用场景:- C3 p) I) @3 A' V2 _0 ^$ p ^8 ?
时间序列分析:在金融、经济、气象等领域,用于展示某个变量随时间的变化趋势。
; n* j, H0 Y' q K* u社会科学:比如在选举数据分析中,展示不同候选人或党派在不同地区或人群中的支持率分布。! ]( ]5 D6 j. v+ W* d. i
生物医学:用于展示不同实验组或治疗方法下的生物统计数据分布。$ _8 }4 \; ] }: Q
绘图教程线条山脊图data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLable= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};colors=makeColorMap([0,0,0;1,1,1],12);figure('Position',[476 246 511 620])p=0.15;yTick=(1:size(data, 2))*p;for i = 1:size(data, 2) [f, x] = ksdensity(data(:, i)); f=f+i*p; pHandle=plot(x, f, 'LineWidth', 1.5,'color',colors(i,:)); hold on; yline(yTick(i),'-.','LineWidth',1,'Color',pHandle.Color,'HandleVisibility','off')endgrid off;box off;legend(lgLable,'box','on','Color',[1,1,1]*0.95,'EdgeColor','none');set(gca, 'YTick',yTick , 'YTickLabel',lgLable,'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname','Times new Roman','color',[1,1,1]*0.9);xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');hold off;8 r4 ?: w) M. z/ M- t; S
3vkvbkdr2z36405175934.png
7 n7 a3 A& K( G
填充山脊图data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLable= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};% colors=makeColorMap(winter,size(data, 2));colors=makeColorMap(jet,size(data, 2));figure('Position',[476 246 511 620])p =0.2;hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; pHandle = plot(x, fShifted,'color',colors(i,:),'LineWidth', 1.5,'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:),'HandleVisibility', 'off') Xfill = [x, fliplr(x)]; Yfill = [fShifted, ones(1, length(x)) * i * p]; fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);endyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLable, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname','Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');ax = gca;hold off;?& M/ y( U- N$ i0 V, }9 x
vw5cn3hlgha6405176034.png
' P$ ^5 F1 k4 O) w& v/ ]
3D填充山脊图data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLabel= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};p = 0.2;xTick=(1:size(data, 2))*p;figure('Position',[476 246 511 620])hold on;colors=makeColorMap(hsv,size(data, 2));legendHandles = zeros(size(data, 2), 1);for i = 1:size(data, 2) [f, y] = ksdensity(data(:, i)); xShifted = i * p; plot3(xShifted * ones(size(f)), y, f, 'LineWidth', 1.5, 'Color', colors(i,:), 'HandleVisibility', 'off'); Yfill = [y, fliplr(y)]; Xfill = [xShifted * ones(1, length(y)), xShifted * ones(1, length(y))]; Zfill = [f, zeros(size(f))]; legendHandles(i) = fill3(Xfill, Yfill, Zfill, colors(i,:), 'EdgeColor', 'none', 'FaceAlpha', 0.3); endgrid off;box on;legend(lgLabel,'box','on','Color',[1,1,1]*0.95,'EdgeColor','none','FontName','Times New Roman','location','best');set(gca, 'XTick',xTick, 'XTickLabel',lgLabel,'FontName','Times New Roman','linewidth',1)xlabel('XXXX-Value');ylabel('YYYY-Value');zlabel('ZZZ-Value');title('Ridge Plot');view([-83.4000 71.6830])hold off;
) v- p& r, f) I% O* G
jesc0dpf44d6405176134.png
3 o: z7 M# e. U7 D不同核山脊图、添加边际散点密度data = randn(100,3)+[ 20 24 28];colors=makeColorMap(jet,size(data, 2));figure('Position',[476 246 511 620])p=0;hold on;yTick=(1:size(data, 2))*p;lineLength = 0.02; % 竖线的长度for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off'); Xfill = [x, fliplr(x)]; Yfill = [fShifted, ones(1, length(x)) * i * p]; fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3); for j = 1:length(data(:, i)) line([data(j, i), data(j, i)], [i * p, i * p + lineLength], 'Color', pHandle.Color, 'LineWidth', 1); endendgrid off;box off;ax=gca;set(ax,'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname','Times new Roman','color',[1,1,1]*0.9);ax.YLim=[0,1];ax.XLim=[15,32];xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');hold off;
" m7 X# C0 I! a+ E, i
z2tbi0l3aoj6405176235.png
8 \0 c5 W$ R! U" O1 a7 l$ z
横坐标方向、全局渐变的散点图2 S! K( s9 `: f( q
data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLabel={'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};p = 0.2;numColors = 256;% 创建一个从紫色到红色再到黄色的颜色映射colorMap =makeColorMap([0.1490 0.0353 0.5608;0.7305 0.2500 0.4922;0.9569 0.9490 0.1765],numColors);% 计算全局的x轴范围xMin = min(data, [], 'all');xMax = max(data, [], 'all');figure('Position',[476 246 511 620])hold on;for i = size(data, 2):-1:1 [f(i,:), x] = ksdensity(data(:, i), 'Kernel', 'triangle'); fShifted = f(i,:) + i * p; % 偏移每个分布 plot(x, fShifted, 'LineWidth', 1.5, 'color', 'k', 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off'); for j = 1:length(x)-1 Xfill = [x(j), x(j+1), x(j+1), x(j)]; Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)]; % 计算当前点的颜色比例 colorRatio = (x(j) - xMin) / (xMax - xMin); colorIdx = min(numColors, max(1, round(colorRatio * (numColors - 1)) + 1)); fill(Xfill, Yfill, colorMap(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.9); endend% 设置轴标签和标题yTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname','Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');% 设置颜色条colormap(colorMap);cBar = colorbar;cBar.TickDirection = 'out';cBar.LineWidth = 1;cBar.TickLength = 0.02;cBar.FontName = 'Times new Roman';caxis([xMin,xMax]);hold off;
( f* g0 A2 m3 Z) n4 G" B% _- e: O
vqqfbahmjlb6405176335.png
4 C2 [8 f, s% ~% O! N3 g横坐标方向、单核渐变图data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};numColors = 256; % 颜色数量colors = jet(numColors); % 使用jet颜色映射figure('Position',[476 246 511 620])p = 0.2;hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; plot(x, fShifted, 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off'); colorGradient = linspace(1, numColors, length(x)); for j = 1:length(x)-1 Xfill = [x(j), x(j+1), x(j+1), x(j)]; Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)]; fill(Xfill, Yfill, colors(round(colorGradient(j)), :), 'EdgeColor', 'none', 'FaceAlpha', 0.7); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');colormap(colors);cBar = colorbar;cBar.TickDirection = 'out';cBar.LineWidth = 1;cBar.TickLength = 0.02;cBar.FontName = 'Times new Roman';hold off;0 s2 T* x. Y+ ?" I& k
bmnf1gboohk6405176435.png
5 M7 G1 h" _9 t2 e3 D3 F# M" G
每个山脊图设置不同颜色,且添加边际散点图data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLable = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};figure('Position', [476 246 511 620])p = 0.3;lineLength = 0.04; % 竖线的长度colors=makeColorMap(hsv,size(data, 2));hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off'); Xfill = [x, fliplr(x)]; Yfill = [fShifted, ones(1, length(x)) * i * p]; fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3); for j = 1:length(data(:, i)) line([data(j, i), data(j, i)], [i * p, i * p + lineLength], 'Color', 'k', 'LineWidth', 1); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLable, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');/ `# k" ^$ n4 v
bih5jfxh3p26405176535.png
5 ^9 J3 Z; R5 e7 w2 }每个山脊图设置不同颜色单核横向颜色渐变data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', ... 'July', 'August', 'September', 'October', 'November', 'December'};p = 0.2;numColors = 256;% 创建12个不同的颜色映射,每个月一个colorMaps = cell(1, 12);colorList={parula,turbo,hsv,hot,cool,spring,summer,autumn,winter,gray,bone,copper,pink,jet,lines,colorcube,prism,flag};for i = 1:12 colorMaps{i} = makeColorMap(colorList{i}, numColors);end% 计算全局的x轴范围xMin = min(data, [], 'all');xMax = max(data, [], 'all');figure('Position', [476 246 511 620])hold on;for i = size(data, 2):-1:1 [f(i,:), x] = ksdensity(data(:, i), 'Kernel', 'triangle'); fShifted = f(i,:) + i * p; % 偏移每个分布 plot(x, fShifted, 'LineWidth', 1.5, 'color', 'k', 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off'); currentColorMap = colorMaps{i}; for j = 1:length(x)-1 Xfill = [x(j), x(j+1), x(j+1), x(j)]; Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)]; colorRatio = (x(j) - xMin) / (xMax - xMin); colorIdx = min(numColors, max(1, round(colorRatio * (numColors - 1)) + 1)); fill(Xfill, Yfill, currentColorMap(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.9); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');hold off;
- {' J- _. r9 x. ]5 l9 p
jy0envbs5ta6405176635.png
, \6 _( Q, B1 y3 i( m
山脊图的 Y值映射颜色变化* N. N5 H% A8 Q
data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};numColors = 100; % 颜色数量colors =makeColorMap(jet, numColors);figure('Position',[476 246 511 620])p = 0.2;hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; plot(x, fShifted, 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off'); % 计算整个分布的最小和最大纵坐标 minY = min(fShifted); maxY = max(fShifted); for j = 1:length(x)-1 Xfill = [x(j), x(j+1), x(j+1), x(j)]; Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)]; avgY = mean(Yfill(3:4)); colorIdx = round(((avgY - minY) / (maxY - minY)) * (numColors - 1)) + 1; fill(Xfill, Yfill, colors(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.6); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');colormap(colors);cBar = colorbar;cBar.TickDirection = 'out';cBar.LineWidth = 1;cBar.TickLength = 0.02;cBar.FontName = 'Times new Roman';hold off;3 s" x8 N0 h, v: W, V& p8 u+ K- @
atxvpxisukx6405176736.png
. A; ?" x1 b% [( |- P' z8 `$ s, l3 @+ N$ k1 E. u1 B9 ]
四分位点0 k4 H$ r+ A, l6 z
data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};colors = makeColorMap(jet, size(data, 2));figure('Position', [476 246 511 620])p = 0.2;hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off') Xfill = [x, fliplr(x)]; Yfill = [fShifted, ones(1, length(x)) * i * p]; fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3); % 计算并标记四分位点 quartiles = quantile(data(:, i), [0.25 0.50 0.75]); for q = quartiles [~, idx] = min(abs(x-q)); plot(q, fShifted(idx), 'o', 'MarkerFaceColor', pHandle.Color, 'MarkerEdgeColor', 'k'); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');hold off;
+ w0 h# f* M$ g
e22qnwebuqh6405176836.png
4 `6 B( @4 k4 X. t# r
data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};colors = makeColorMap(jet, size(data, 2));figure('Position', [476 246 511 620])p = 0.2;hold on;for i = size(data, 2):-1:1 [f, x] = ksdensity(data(:, i)); fShifted = f + i * p; pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off'); yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off'); Xfill = [x, fliplr(x)]; Yfill = [fShifted, ones(1, length(x)) * i * p]; fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3); % 计算并标记四分位点,并绘制竖线 quartiles = quantile(data(:, i), [0.25 0.50 0.75]); for q = quartiles [~, idx] = min(abs(x-q)); plot(q, fShifted(idx), 'o', 'MarkerFaceColor', pHandle.Color, 'MarkerEdgeColor', 'k'); line([q q], [fShifted(idx) i * p], 'Color', pHandle.Color, 'LineStyle', '-.','LineWidth', 1); endendyTick = (1:size(data, 2)) * p;set(gca, 'YTick', yTick, ... 'YTickLabel', lgLabel, ... 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ... 'fontname', 'Times new Roman');xlabel('XXXX-Value');ylabel('YYYY-Value');title('Ridge Plot');hold off;
( S5 \) Z+ R3 w; H6 h
3gmptzlmnvm6405176936.png
! f5 P6 x5 ?" \- r. q9 `1 a5 Q其中makeColorMap函数代码之前「一张图搞定绘图配色问题」有详细介绍。
8 ?6 @9 ^) W& `% ~9 M0 v" E% q- -THE END- -0 X. `4 {% Z# w! v! Z1 f7 G
# Q4 w/ v* R' c0 p2 \7 P
源码下载:gitee下载:https://gitee.com/iDMatlab/ridgePlot
) C2 Y% a# h2 h: h; l8 O
uuumgqrquy26405177036.png
) _$ j! J1 L2 x. pQQ 群下载:3 A6 C' ?( ~ Q# D' O" U
ntcdvhwlhg46405177136.png
7 f4 A' [* D+ \% l
fileexchange 下载: G4 D, F) @% \8 a. Z% y
qjch5egfehb6405177236.png
, a6 r7 _' S. W4 @! r' G3 k
8 @3 u/ U; `. j7 K0 S
参考资料:
/ `, a/ o: P. s) F& |+ [【1】https://it.sohu.com/a/704677145_121123706
3 b# l; S2 ~0 s: @" g! f
2d0o2vwomyx6405177336.gif
; [8 S( {; ? n, U + e" E4 Q5 D. `5 D
送书活动
" `5 y V4 L* e* W " U" t/ O2 z, g0 J1 G8 q
% L' _5 Z5 j; k" o- I7 t# z
* M2 t! m, p. w' i7 Q* _包邮赠送 「北京大学出版社」赞助《3D科研绘图与学术图表绘制从入门到精通》
: I; R- H2 J& L1 G: K( {
7 z, i* K# ~8 {专业级3D科研绘图与学术图表绘制指南:以“设计基本概念+软件底层原理+案例实际操作”的思路进行全方位讲解,涵盖化学、材料学、生物医学等领域的科学可视化的艺术化表达4 ~3 l# A0 X+ x: F8 o/ g9 Q
实例丰富:我们涵盖各类绘图软件与工具,让你能够自如运用不同技术绘制出高质量的图表。内容全面:全流程讲解3D科研绘图与学术图表绘制的方法,有效填补了现有同类型参考书的空白。经验总结:作者多年一线研发实战经验全面归纳整理,毫无保留分享技术要领。大咖力荐:多位大型科技公司技术高管和高校相关领域教研专家推荐。全彩印刷:图表案例精彩呈现,带来良好的阅读体验,方便理解和学习。
% l& G2 V, m: _, l了解更多
# U# ~/ ?! a% j【抽奖方式及满足条件】:6 d! ^: M$ z! I, N6 E' e3 c
1.关注「好玩的MATLAB 」公众号和视频号
- L! V# w, x% l I% B: i/ g8 m 1 g1 r9 B* \" z- K0 R4 p
2.给本文点【赞】+【在看】;$ ^# |7 h+ t! p/ M- K+ m( t- u
3.留言区评论点赞最多的前2名。0 l. x' s/ M D* I6 S6 ]4 W" [5 _
4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。' J( p, r( E0 E9 t/ Q6 O
同时满足上述4个条件的读者朋友,包邮赠送一本.: _. l. T" ]# x+ L$ V q% `1 ?
【开奖时间】:2023年11月15日中午12点9 P' n" [$ k! L9 T; |3 Z
【领奖方式】:在开奖时加小编私人微信:idmatlab, P- c7 d, a% Q# k% d' r
扫一扫加管理员微信* r% N% a9 g7 b, `( G$ \! Q
. G: H' i8 m/ P8 b. ^; x4 ~
 |