电子产业一站式赋能平台

PCB联盟网

搜索
查看: 317|回复: 0
收起左侧

MATLAB|科研绘图|山脊图

[复制链接]

260

主题

260

帖子

1833

积分

三级会员

Rank: 3Rank: 3

积分
1833
发表于 2023-11-14 13:09:00 | 显示全部楼层 |阅读模式
点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!- S: m. O, c8 X7 [' Z; Y

yqrlenlw0o364017645637.jpg

yqrlenlw0o364017645637.jpg

, Z0 t9 E8 w  y/ c) Y好玩的matlab, }- x+ P% a6 U' I1 ~
带你解锁不一样的matlab新玩法6 x$ M! G+ T- N

. N1 n. V0 |3 y& J, ]' p0 J今天介绍一下山脊图,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】上周去逛了一下商店看见一个笔架
7 A8 B- F" X0 D& ~" T* }" s

4sp1lblvyxu64017645737.png

4sp1lblvyxu64017645737.png
% n8 w5 E  S8 Q9 d7 i
这突然让我想起,这个不就像科研绘图的山脊图嘛,于是我打算用 MATLAB 复刻一个。5 c* m( z) c2 F# G- j1 s; |

vmoisc4xxgs64017645837.png

vmoisc4xxgs64017645837.png

, J2 e) l& G$ B- Q4 b% [  G  x0 T7 D8 F* v3 A* S& J
效果图
+ p+ k, C$ X3 N4 c

vyc2mssdn5w64017645938.png

vyc2mssdn5w64017645938.png
" \0 {- y1 {6 K+ ?. \2 K
" o$ i+ U, H- _1 s6 y, ~% @

o12xc2bbb4q64017646038.gif

o12xc2bbb4q64017646038.gif
0 N# O( o) V6 N& C
山脊图介绍山脊图(Ridge Plot),也被称为Joy Plot,是一种用于可视化数据分布的图表,特别是用于显示多个组的分布情况。在这种图表中,每个组的数据分布都通过平滑的密度曲线来表示,这些曲线沿着垂直轴堆叠,形成类似山脊的视觉效果。山脊图是核密度估计(KDE)的一个应用,它提供了比传统的条形图或直方图更平滑的数据分布视图。7 s" a$ F8 t/ ]$ e$ r" X8 o' M
用途:山脊图主要用于展示和比较不同组或类别内数据的分布情况。它特别适合于以下情境:
6 x7 Q5 L( n. m" I比较多个分布:当需要展示和比较多组数据的分布形状时,山脊图能够直观地展示出分布之间的差异。. n9 K4 r  u; G& P! s
展现趋势变化:在时间序列数据中,山脊图可以用来展示数据随时间的变化趋势。
4 M+ m* Y1 K8 U4 @6 z优化空间利用:通过堆叠的方式,山脊图能在有限的空间内展示大量的分布信息。
0 G, L( R% b0 m* _  r2 X缺点:9 k. O9 K& a) x# h* I
可读性:对于不熟悉这种图表的观众来说,山脊图可能难以理解和解读。+ }9 A. E$ L- K6 r& Y' ~
叠加问题:当曲线重叠较多时,可能会导致图表的某些部分难以区分。8 J$ p3 P3 D: k8 d: t* f% z* L
数据量限制:对于数据量非常大的数据集,山脊图可能不那么有效,因为过多的曲线会使图表变得杂乱。
: {6 d2 |. L4 d$ y( q4 h" [. ?- {应用场景
$ R; X+ n) S0 |& W' P% C时间序列分析:在金融、经济、气象等领域,用于展示某个变量随时间的变化趋势。
7 Z# z3 [; d7 A5 \社会科学:比如在选举数据分析中,展示不同候选人或党派在不同地区或人群中的支持率分布。1 H8 c& M$ ?3 r
生物医学:用于展示不同实验组或治疗方法下的生物统计数据分布。
5 H+ X5 _% f; E, m0 Y4 e  ~8 S绘图教程线条山脊图
  • 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;
    , v# l. f5 L) x; _$ P& f

    othqhwuv2ye64017646138.png

    othqhwuv2ye64017646138.png
    / _/ L1 ]: z) Q3 c9 H8 ~! |/ j
    填充山脊图
  • 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;?% t: ^/ e+ ~/ k' A% e! Y- z; Z2 v

    x0ovdirbx5x64017646238.png

    x0ovdirbx5x64017646238.png

      m; O/ v9 U, ?8 j3D填充山脊图
  • 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;6 k+ l$ B% K, Q

    1youvt2oorm64017646338.png

    1youvt2oorm64017646338.png

    * W5 G7 t9 ~: c: u4 f4 m不同核山脊图、添加边际散点密度
  • 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;2 k; O0 ~7 j) y9 z' x! j3 Q% Z, ?

    romgihmunch64017646438.png

    romgihmunch64017646438.png
    4 F9 X3 O; O! B' N5 m4 a/ S1 x
    横坐标方向、全局渐变的散点图/ k' C8 F. n5 @) I* ]  q: I$ k! @
  • 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;
    4 Z2 i$ w0 E) Y3 u3 m( k

    ui24zhcnuvl64017646538.png

    ui24zhcnuvl64017646538.png

    : P1 w1 A( M  c: u横坐标方向、单核渐变图
  • 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;
    8 C: e! H% Q0 {% U) k

    3uggpr3bw3d64017646638.png

    3uggpr3bw3d64017646638.png

    $ M7 _5 o1 @' `每个山脊图设置不同颜色,且添加边际散点图
  • 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');$ l' q7 n! i7 G8 E# p& G$ N6 ^

    rbjr3lkp2ik64017646738.png

    rbjr3lkp2ik64017646738.png
    0 \' N7 d0 F- z3 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'};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;
    * o) |! p- K" s& ~& a# o

    lkls24x1vtp64017646839.png

    lkls24x1vtp64017646839.png
    / O; C# j2 j7 K1 s
    山脊图的 Y值映射颜色变化% S, y2 y: p( e1 B
  • 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;
    / A7 ~7 k5 X9 C  J' ~( A1 ]) N

    ck1ovagxuo164017646939.png

    ck1ovagxuo164017646939.png

    7 g+ ^7 }* G0 J# r7 B) c! m9 J! K: ?+ ]
    四分位点; b# ^3 d5 g! `# F
  • 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;
    6 z* j8 K: K  J

    ndwexmboxth64017647039.png

    ndwexmboxth64017647039.png

    8 I0 R0 z; v9 h
  • 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;
    1 f  L5 ^4 V3 R' I* _: O; s

    uufxiwy0prx64017647140.png

    uufxiwy0prx64017647140.png
    ) g2 x5 j( G8 h3 N, a& y
    其中makeColorMap函数代码之前「一张图搞定绘图配色问题」有详细介绍。
    ) c' X3 ?. O5 {& @- -THE END- -, g# c* p9 Z) w( k" Q# T

    8 w( m3 K. {5 f+ [源码下载:gitee下载:https://gitee.com/iDMatlab/ridgePlot
    $ L6 n. X7 g4 T3 ?- ?3 V2 J$ W

    5sa3ueoitcn64017647240.png

    5sa3ueoitcn64017647240.png

    4 ^/ U2 v9 T7 b6 T0 B8 KQQ 群下载:8 @; Z2 ?0 T6 x; {( z: g% ~2 f

    sxmxcfeg0yv64017647340.png

    sxmxcfeg0yv64017647340.png
    3 V8 X" V$ l% n2 q+ m2 S) y' ^
    fileexchange 下载:
    0 D) R4 R8 Y& C, ~

    grbxtxwcmp564017647440.png

    grbxtxwcmp564017647440.png

    / `* R# u0 V. {$ O# `$ V. V# f4 G. d" [( w
    参考资料:
    $ g4 M% g6 C0 \* e. h; F7 s8 C【1】https://it.sohu.com/a/704677145_121123706
    : V3 p7 A  q5 J, A0 h' |9 Q

    bc50h4yqaie64017647540.gif

    bc50h4yqaie64017647540.gif

    % ?# r! b4 G, H
    : R9 {  i( ^+ @送书活动
    ! \' A2 p9 s  n) f
    8 v  c  \" X! P, e) T, ~& G4 S0 A. z6 q

    ; R, J% v" F8 D  s( P包邮赠送 「北京大学出版社赞助《3D科研绘图与学术图表绘制从入门到精通》
    & ]- Z1 \  H0 f9 G+ f  Z: u9 ]
    ; `: p# z9 \# d0 b8 ?3 R, X7 ]专业级3D科研绘图与学术图表绘制指南:以“设计基本概念+软件底层原理+案例实际操作”的思路进行全方位讲解,涵盖化学、材料学、生物医学等领域的科学可视化的艺术化表达5 {0 p" O  H3 G  ~2 G
    实例丰富:我们涵盖各类绘图软件与工具,让你能够自如运用不同技术绘制出高质量的图表。内容全面:全流程讲解3D科研绘图与学术图表绘制的方法,有效填补了现有同类型参考书的空白。经验总结:作者多年一线研发实战经验全面归纳整理,毫无保留分享技术要领。大咖力荐:多位大型科技公司技术高管和高校相关领域教研专家推荐。
  • 全彩印刷:图表案例精彩呈现,带来良好的阅读体验,方便理解和学习。- F8 @* X! G3 }& A1 ?1 t8 C3 D
    了解更多
    " G% R" x2 `- f8 _, X& ~: i【抽奖方式及满足条件】:( |! l7 h. Z' R. |4 x# s0 U' Z! J4 e
    1.关注「好玩的MATLAB 」公众号和视频号7 U: a# D) `  ~: _2 W3 y
    % {1 o$ S" }: N( u. ]' H
    2.给本文点【】+【在看】;
    7 C- K! b( r+ k9 G5 N3.留言区评论点赞最多的前2名。
    . ]- l: V( e* r9 e6 z5 t+ X- n* W- U4.本活动只针对从未获过奖的同学,之前获过奖的小伙伴,不用参加。
    6 Z9 Z% [2 b# ^) F2 c/ x+ T同时满足上述4个条件的读者朋友,包邮赠送一本.! `1 N3 k% K& S
    【开奖时间】:2023年11月15日中午12点
    0 Q* F" ?; T' X  d- p【领奖方式】:在开奖时加小编私人微信:idmatlab
    & L0 U+ m# t$ S3 [  r扫一扫加管理员微信3 s0 t! o( C; P& N% k

    1 M; f; P- ]: a3 o, |
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表