• MATLAB|科研绘图|山脊图


    目录

    公众号:

    效果图

    山脊图介绍

    绘图教程


     
    

    公众号:

    效果图

    山脊图介绍

    山脊图(Ridge Plot),也被称为Joy Plot,是一种用于可视化数据分布的图表,特别是用于显示多个组的分布情况。在这种图表中,每个组的数据分布都通过平滑的密度曲线来表示,这些曲线沿着垂直轴堆叠,形成类似山脊的视觉效果。山脊图是核密度估计(KDE)的一个应用,它提供了比传统的条形图或直方图更平滑的数据分布视图。

    用途:山脊图主要用于展示和比较不同组或类别内数据的分布情况。它特别适合于以下情境:

    • 比较多个分布:当需要展示和比较多组数据的分布形状时,山脊图能够直观地展示出分布之间的差异。
    • 展现趋势变化:在时间序列数据中,山脊图可以用来展示数据随时间的变化趋势。
    • 优化空间利用:通过堆叠的方式,山脊图能在有限的空间内展示大量的分布信息。

    缺点:

    • 可读性:对于不熟悉这种图表的观众来说,山脊图可能难以理解和解读。
    • 叠加问题:当曲线重叠较多时,可能会导致图表的某些部分难以区分。
    • 数据量限制:对于数据量非常大的数据集,山脊图可能不那么有效,因为过多的曲线会使图表变得杂乱。

    应用场景

    • 时间序列分析:在金融、经济、气象等领域,用于展示某个变量随时间的变化趋势。
    • 社会科学:比如在选举数据分析中,展示不同候选人或党派在不同地区或人群中的支持率分布。
    • 生物医学:用于展示不同实验组或治疗方法下的生物统计数据分布。

    绘图教程

    线条山脊图

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLable= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};
    3. colors=makeColorMap([0,0,0;1,1,1],12);
    4. figure('Position',[476 246 511 620])
    5. p=0.15;
    6. yTick=(1:size(data, 2))*p;
    7. for i = 1:size(data, 2)
    8. [f, x] = ksdensity(data(:, i));
    9. f=f+i*p;
    10. pHandle=plot(x, f, 'LineWidth', 1.5,'color',colors(i,:));
    11. hold on;
    12. yline(yTick(i),'-.','LineWidth',1,'Color',pHandle.Color,'HandleVisibility','off')
    13. end
    14. grid off;box off;
    15. legend(lgLable,'box','on','Color',[1,1,1]*0.95,'EdgeColor','none');
    16. set(gca, 'YTick',yTick , 'YTickLabel',lgLable,'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    17. 'fontname','Times new Roman','color',[1,1,1]*0.9);
    18. xlabel('XXXX-Value');
    19. ylabel('YYYY-Value');
    20. title('Ridge Plot');
    21. hold off;

     填充山脊图

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLable= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};
    3. % colors=makeColorMap(winter,size(data, 2));
    4. colors=makeColorMap(jet,size(data, 2));
    5. figure('Position',[476 246 511 620])
    6. p =0.2;
    7. hold on;
    8. for i = size(data, 2):-1:1
    9. [f, x] = ksdensity(data(:, i));
    10. fShifted = f + i * p;
    11. pHandle = plot(x, fShifted,'color',colors(i,:),'LineWidth', 1.5,'HandleVisibility', 'off');
    12. yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:),'HandleVisibility', 'off')
    13. Xfill = [x, fliplr(x)];
    14. Yfill = [fShifted, ones(1, length(x)) * i * p];
    15. fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    16. end
    17. yTick = (1:size(data, 2)) * p;
    18. ax = gca;
    19. hold off;
    20. set(ax, 'YTick', yTick, ...
    21. 'YTickLabel', lgLable, ...
    22. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    23. 'fontname','Times new Roman');
    24. xlabel('XXXX-Value');
    25. ylabel('YYYY-Value');
    26. title('Ridge Plot');

    3D填充山脊图

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel= {'January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December'};
    3. p = 0.2;
    4. xTick=(1:size(data, 2))*p;
    5. figure('Position',[476 246 511 620])
    6. hold on;
    7. colors=makeColorMap(hsv,size(data, 2));
    8. legendHandles = zeros(size(data, 2), 1);
    9. for i = 1:size(data, 2)
    10. [f, y] = ksdensity(data(:, i));
    11. xShifted = i * p;
    12. plot3(xShifted * ones(size(f)), y, f, 'LineWidth', 1.5, 'Color', colors(i,:), 'HandleVisibility', 'off');
    13. Yfill = [y, fliplr(y)];
    14. Xfill = [xShifted * ones(1, length(y)), xShifted * ones(1, length(y))];
    15. Zfill = [f, zeros(size(f))];
    16. legendHandles(i) = fill3(Xfill, Yfill, Zfill, colors(i,:), 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    17. end
    18. grid off;
    19. box on;
    20. legend(lgLabel,'box','on','Color',[1,1,1]*0.95,'EdgeColor','none','FontName','Times New Roman','location','best');
    21. set(gca, 'XTick',xTick, 'XTickLabel',lgLabel,'FontName','Times New Roman','linewidth',1)
    22. xlabel('XXXX-Value');
    23. ylabel('YYYY-Value');
    24. zlabel('ZZZ-Value');
    25. title('Ridge Plot');
    26. view([-83.4000 71.6830])
    27. hold off;

    不同核山脊图、添加边际散点密度

    1. data = randn(100,3)+[ 20 24 28];
    2. colors=makeColorMap(jet,size(data, 2));
    3. figure('Position',[476 246 511 620])
    4. p=0;
    5. hold on;
    6. yTick=(1:size(data, 2))*p;
    7. lineLength = 0.02; % 竖线的长度
    8. for i = size(data, 2):-1:1
    9. [f, x] = ksdensity(data(:, i));
    10. fShifted = f + i * p;
    11. pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off');
    12. yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off');
    13. Xfill = [x, fliplr(x)];
    14. Yfill = [fShifted, ones(1, length(x)) * i * p];
    15. fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    16. for j = 1:length(data(:, i))
    17. line([data(j, i), data(j, i)], [i * p, i * p + lineLength], 'Color', pHandle.Color, 'LineWidth', 1);
    18. end
    19. end
    20. grid off;box off;
    21. ax=gca;
    22. set(ax,'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    23. 'fontname','Times new Roman','color',[1,1,1]*0.9);
    24. ax.YLim=[0,1];
    25. ax.XLim=[15,32];
    26. xlabel('XXXX-Value');
    27. ylabel('YYYY-Value');
    28. title('Ridge Plot');
    29. hold off;

    横坐标方向、全局渐变的散点图

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel={'January', 'February', 'March', 'April', 'May', 'June',
    3. 'July', 'August', 'September', 'October', 'November', 'December'};
    4. p = 0.2;
    5. numColors = 256;
    6. % 创建一个从紫色到红色再到黄色的颜色映射
    7. colorMap =makeColorMap([0.1490 0.0353 0.5608;0.7305 0.2500 0.4922;0.9569 0.9490 0.1765],numColors);
    8. % 计算全局的x轴范围
    9. xMin = min(data, [], 'all');
    10. xMax = max(data, [], 'all');
    11. figure('Position',[476 246 511 620])
    12. hold on;
    13. for i = size(data, 2):-1:1
    14. [f(i,:), x] = ksdensity(data(:, i), 'Kernel', 'triangle');
    15. fShifted = f(i,:) + i * p; % 偏移每个分布
    16. plot(x, fShifted, 'LineWidth', 1.5, 'color', 'k', 'HandleVisibility', 'off');
    17. yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off');
    18. for j = 1:length(x)-1
    19. Xfill = [x(j), x(j+1), x(j+1), x(j)];
    20. Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)];
    21. % 计算当前点的颜色比例
    22. colorRatio = (x(j) - xMin) / (xMax - xMin);
    23. colorIdx = min(numColors, max(1, round(colorRatio * (numColors - 1)) + 1));
    24. fill(Xfill, Yfill, colorMap(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.9);
    25. end
    26. end
    27. % 设置轴标签和标题
    28. yTick = (1:size(data, 2)) * p;
    29. set(gca, 'YTick', yTick, ...
    30. 'YTickLabel', lgLabel, ...
    31. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    32. 'fontname','Times new Roman');
    33. xlabel('XXXX-Value');
    34. ylabel('YYYY-Value');
    35. title('Ridge Plot');
    36. % 设置颜色条
    37. colormap(colorMap);
    38. cBar = colorbar;
    39. cBar.TickDirection = 'out';
    40. cBar.LineWidth = 1;
    41. cBar.TickLength = 0.02;
    42. cBar.FontName = 'Times new Roman';
    43. caxis([xMin,xMax]);
    44. hold off;

    横坐标方向、单核渐变图

    1. data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};
    3. numColors = 256; % 颜色数量
    4. colors = jet(numColors); % 使用jet颜色映射
    5. figure('Position',[476 246 511 620])
    6. p = 0.2;
    7. hold on;
    8. for i = size(data, 2):-1:1
    9. [f, x] = ksdensity(data(:, i));
    10. fShifted = f + i * p;
    11. plot(x, fShifted, 'LineWidth', 1.5, 'HandleVisibility', 'off');
    12. yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off');
    13. colorGradient = linspace(1, numColors, length(x));
    14. for j = 1:length(x)-1
    15. Xfill = [x(j), x(j+1), x(j+1), x(j)];
    16. Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)];
    17. fill(Xfill, Yfill, colors(round(colorGradient(j)), :), 'EdgeColor', 'none', 'FaceAlpha', 0.7);
    18. end
    19. end
    20. yTick = (1:size(data, 2)) * p;
    21. set(gca, 'YTick', yTick, 'YTickLabel', lgLabel, ...
    22. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    23. 'fontname', 'Times new Roman');
    24. xlabel('XXXX-Value');
    25. ylabel('YYYY-Value');
    26. title('Ridge Plot');
    27. colormap(colors);
    28. cBar = colorbar;
    29. cBar.TickDirection = 'out';
    30. cBar.LineWidth = 1;
    31. cBar.TickLength = 0.02;
    32. cBar.FontName = 'Times new Roman';
    33. hold off;

    每个山脊图设置不同颜色,且添加边际散点图

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLable = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};
    3. figure('Position', [476 246 511 620])
    4. p = 0.3;
    5. lineLength = 0.04; % 竖线的长度
    6. colors=makeColorMap(hsv,size(data, 2));
    7. hold on;
    8. for i = size(data, 2):-1:1
    9. [f, x] = ksdensity(data(:, i));
    10. fShifted = f + i * p;
    11. pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off');
    12. yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off');
    13. Xfill = [x, fliplr(x)];
    14. Yfill = [fShifted, ones(1, length(x)) * i * p];
    15. fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    16. for j = 1:length(data(:, i))
    17. line([data(j, i), data(j, i)], [i * p, i * p + lineLength], 'Color', 'k', 'LineWidth', 1);
    18. end
    19. end
    20. yTick = (1:size(data, 2)) * p;
    21. set(gca, 'YTick', yTick, ...
    22. 'YTickLabel', lgLable, ...
    23. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    24. 'fontname', 'Times new Roman');
    25. xlabel('XXXX-Value');
    26. ylabel('YYYY-Value');
    27. title('Ridge Plot');

    每个山脊图设置不同颜色单核横向颜色渐变

    1. data = randn(100,12)+[ 20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', ...
    3. 'July', 'August', 'September', 'October', 'November', 'December'};
    4. p = 0.2;
    5. numColors = 256;
    6. % 创建12个不同的颜色映射,每个月一个
    7. colorMaps = cell(1, 12);
    8. colorList={parula,turbo,hsv,hot,cool,spring,summer,autumn,winter,gray,bone,copper,pink,jet,lines,colorcube,prism,flag};
    9. for i = 1:12
    10. colorMaps{i} = makeColorMap(colorList{i}, numColors);
    11. end
    12. % 计算全局的x轴范围
    13. xMin = min(data, [], 'all');
    14. xMax = max(data, [], 'all');
    15. figure('Position', [476 246 511 620])
    16. hold on;
    17. for i = size(data, 2):-1:1
    18. [f(i,:), x] = ksdensity(data(:, i), 'Kernel', 'triangle');
    19. fShifted = f(i,:) + i * p; % 偏移每个分布
    20. plot(x, fShifted, 'LineWidth', 1.5, 'color', 'k', 'HandleVisibility', 'off');
    21. yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off');
    22. currentColorMap = colorMaps{i};
    23. for j = 1:length(x)-1
    24. Xfill = [x(j), x(j+1), x(j+1), x(j)];
    25. Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)];
    26. colorRatio = (x(j) - xMin) / (xMax - xMin);
    27. colorIdx = min(numColors, max(1, round(colorRatio * (numColors - 1)) + 1));
    28. fill(Xfill, Yfill, currentColorMap(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.9);
    29. end
    30. end
    31. yTick = (1:size(data, 2)) * p;
    32. set(gca, 'YTick', yTick, ...
    33. 'YTickLabel', lgLabel, ...
    34. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    35. 'fontname', 'Times new Roman');
    36. xlabel('XXXX-Value');
    37. ylabel('YYYY-Value');
    38. title('Ridge Plot');
    39. hold off;

     

    山脊图的 Y值映射颜色变化

    1. data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};
    3. numColors = 100; % 颜色数量
    4. colors =makeColorMap(jet, numColors);
    5. figure('Position',[476 246 511 620])
    6. p = 0.2;
    7. hold on;
    8. for i = size(data, 2):-1:1
    9. [f, x] = ksdensity(data(:, i));
    10. fShifted = f + i * p;
    11. plot(x, fShifted, 'LineWidth', 1.5, 'HandleVisibility', 'off');
    12. yline(i * p, '-.', 'LineWidth', 1, 'HandleVisibility', 'off');
    13. % 计算整个分布的最小和最大纵坐标
    14. minY = min(fShifted);
    15. maxY = max(fShifted);
    16. for j = 1:length(x)-1
    17. Xfill = [x(j), x(j+1), x(j+1), x(j)];
    18. Yfill = [i * p, i * p, fShifted(j+1), fShifted(j)];
    19. avgY = mean(Yfill(3:4));
    20. colorIdx = round(((avgY - minY) / (maxY - minY)) * (numColors - 1)) + 1;
    21. fill(Xfill, Yfill, colors(colorIdx, :), 'EdgeColor', 'none', 'FaceAlpha', 0.6);
    22. end
    23. end
    24. yTick = (1:size(data, 2)) * p;
    25. set(gca, 'YTick', yTick, 'YTickLabel', lgLabel, ...
    26. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    27. 'fontname', 'Times new Roman');
    28. xlabel('XXXX-Value');
    29. ylabel('YYYY-Value');
    30. title('Ridge Plot');
    31. colormap(colors);
    32. cBar = colorbar;
    33. cBar.TickDirection = 'out';
    34. cBar.LineWidth = 1;
    35. cBar.TickLength = 0.02;
    36. cBar.FontName = 'Times new Roman';
    37. hold off;

    四分位点

    1. data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};
    3. colors = makeColorMap(jet, size(data, 2));
    4. figure('Position', [476 246 511 620])
    5. p = 0.2;
    6. hold on;
    7. for i = size(data, 2):-1:1
    8. [f, x] = ksdensity(data(:, i));
    9. fShifted = f + i * p;
    10. pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off');
    11. yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off')
    12. Xfill = [x, fliplr(x)];
    13. Yfill = [fShifted, ones(1, length(x)) * i * p];
    14. fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    15. % 计算并标记四分位点
    16. quartiles = quantile(data(:, i), [0.25 0.50 0.75]);
    17. for q = quartiles
    18. [~, idx] = min(abs(x-q));
    19. plot(q, fShifted(idx), 'o', 'MarkerFaceColor', pHandle.Color, 'MarkerEdgeColor', 'k');
    20. end
    21. end
    22. yTick = (1:size(data, 2)) * p;
    23. set(gca, 'YTick', yTick, ...
    24. 'YTickLabel', lgLabel, ...
    25. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    26. 'fontname', 'Times new Roman');
    27. xlabel('XXXX-Value');
    28. ylabel('YYYY-Value');
    29. title('Ridge Plot');
    30. hold off;

    1. data = randn(100,12) + [20 22 24 26 28 31 30 28 26 24 22 20];
    2. lgLabel = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'};
    3. colors = makeColorMap(jet, size(data, 2));
    4. figure('Position', [476 246 511 620])
    5. p = 0.2;
    6. hold on;
    7. for i = size(data, 2):-1:1
    8. [f, x] = ksdensity(data(:, i));
    9. fShifted = f + i * p;
    10. pHandle = plot(x, fShifted, 'color', colors(i,:), 'LineWidth', 1.5, 'HandleVisibility', 'off');
    11. yline(i * p, '-.', 'LineWidth', 1, 'Color', colors(i,:), 'HandleVisibility', 'off');
    12. Xfill = [x, fliplr(x)];
    13. Yfill = [fShifted, ones(1, length(x)) * i * p];
    14. fill(Xfill, Yfill, pHandle.Color, 'EdgeColor', 'none', 'FaceAlpha', 0.3);
    15. % 计算并标记四分位点,并绘制竖线
    16. quartiles = quantile(data(:, i), [0.25 0.50 0.75]);
    17. for q = quartiles
    18. [~, idx] = min(abs(x-q));
    19. plot(q, fShifted(idx), 'o', 'MarkerFaceColor', pHandle.Color, 'MarkerEdgeColor', 'k');
    20. line([q q], [fShifted(idx) i * p], 'Color', pHandle.Color, 'LineStyle', '-.','LineWidth', 1);
    21. end
    22. end
    23. yTick = (1:size(data, 2)) * p;
    24. set(gca, 'YTick', yTick, ...
    25. 'YTickLabel', lgLabel, ...
    26. 'LineWidth', 1.5, 'XMinorTick', 'on', 'TickDir', 'out', ...
    27. 'fontname', 'Times new Roman');
    28. xlabel('XXXX-Value');
    29. ylabel('YYYY-Value');
    30. title('Ridge Plot');
    31. hold off;

    其中makeColorMap函数代码之前「一张图搞定绘图配色问题有详细介绍。

  • 相关阅读:
    18.flink kafka使用thrift序列化
    C语言字符串函数简单介绍
    Mysql -- 表的操作
    Android—ATMS应用启动流程
    zabbix
    2022.09.11学习笔记
    Debian 查看与修改IP
    iceberg简介004_iceberg和其他数据湖框架的对比---​​数据湖Apache Iceberg工作笔记0004
    医院管理中,什么才算得上智慧机房?
    后端程序员推荐——接口Mock工具json-server
  • 原文地址:https://blog.csdn.net/zzx2016zzx/article/details/134397243