查看: 4021|回复: 6|关注: 1

[我分享] 豆粑粑 散点密度 热图 等高线图

[复制链接]

MATLAB 基础讨论
版块优秀回答者

中级

570 麦片

财富积分


5001500


73

主题

1451

帖子

105

最佳答案
  • 关注者: 80
发表于 2018-3-28 20:37:35 | 显示全部楼层 |阅读模式
本帖最后由 meatball1982 于 2018-3-28 20:54 编辑

这是个记录的帖子:
等我不在这个世界上的时候,希望有人能通过这个帖子的内容,少走些弯路,多学些。

最近,总有问到如何画散点的出现概率的图(密度分布)

比如给你一堆散点,让你画出各个位置,点出现的概率,用不同的color表示。
这里提供一种可行的方法
(注意,
01.color代表概率时 ,colorbar可能要另外自己生成.
02.只作示意图,不完全对应点出现的位置)
fig_den_plot.png


思路。
01.统计点,
02.作处理
03.输出。

----------------------------
01统计点
这一步很多函数都可以作,但最方便的就是自己写一个二重循环,想怎么折腾,就怎么折腾。
我暂时用的时hist3函数。
可以得到一个2D的矩阵,存放点密度。
----------------------------
02.作处理
这一步,很多坛友都不会作,统计出来的毕竟是散点,直接用于作图,可能很规范,但很可能不好看。
至于一定要作什么,看每个人要求图长什么样。一般的,
我会作
a.平滑(我用的smooth2函数,附件里有提供,不是对所有的数据都好)
b.归一化
c.-log
d.去不想要的值(比如出现概率是0,就不画)
----------------------------
03.输出。
这一步方法其实也不少,
surf,contourf都行,
surf可以知道原来的数据长什么样,最好再加一contour3效果刚刚地。

例子里我用的是contourf.不画黑线。

悄悄的说,附件里有数据和code



  1. clear all
  2. clc
  3. clf

  4. %% %%%%%%%%%%%%%%%%%%%%%%%%%
  5. % outline
  6. % plot point density
  7. %
  8. % 01.load points ---------------------------------
  9. % 02.calculate density ---------------------------
  10. % 03.post process --------------------------------
  11. % 04.output --------------------------------------

  12. %% main
  13. %
  14. % 01.load points ---------------------------------
  15. x=load('../data/x.txt');
  16. x(:,1)=[];
  17. y=load('../data/y.txt');
  18. y(:,1)=[];
  19. p=[x';y']';

  20. % 02.calculate density ---------------------------
  21. x_min=0;x_max=25;n_p_x=200;
  22. y_min=1.5;y_max=4.5;n_p_y=201;

  23. x_edge = linspace(x_min,x_max,n_p_x);
  24. y_edge = linspace(y_min,y_max,n_p_y);
  25. [X_edge,Y_edge]=meshgrid(x_edge,y_edge);
  26. ctrs{1}=x_edge;
  27. ctrs{2}=y_edge;
  28. hist_mat = hist3(p,'ctrs',ctrs);

  29. % 03.post process --------------------------------
  30. hist_mat = smooth2(hist_mat,3,3);
  31. hist_mat = -log(hist_mat);
  32. tm = hist_mat(~isinf(hist_mat));
  33. hist_mat(isinf(hist_mat))=max(tm);
  34. hist_mat= hist_mat-min(hist_mat(:));

  35. % 04.output var -----------------------------------
  36. xx = X_edge;
  37. yy = Y_edge;
  38. zz = hist_mat';

  39. % hold on
  40. subplot(1,2,1)
  41. plot(x,y,'.')
  42. axis([x_min x_max y_min y_max])
  43. grid on
  44. xlabel('I am x')
  45. ylabel('I am y')

  46. subplot(1,2,2)
  47. hold on
  48. n_line=20;
  49. zz(zz==max(zz(:)))=nan;
  50. h=contourf(xx,yy,zz,n_line,'edgecolor','none');
  51. % contour(xx,yy,zz,n_line);
  52. hidden off
  53. shading interp
  54. grid on
  55. box on
  56. colormap(jet)
  57. xlabel('I am x')
  58. ylabel('I am y')
复制代码




补充内容 (2019-9-16 09:20):
7楼有一个例子,是文章中的图,相同方式画的。
fig_den_plot.png

work_dens_plot.zip

54.54 KB, 下载次数: 78

data and code

回复主题 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


0

主题

2

帖子

0

最佳答案
发表于 2018-5-18 17:09:46 | 显示全部楼层
您好,我想请问一下,如果颜色要表示概率密度,colorbar具体应该怎么做?谢谢!
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

中级

570 麦片

财富积分


5001500


73

主题

1451

帖子

105

最佳答案
  • 关注者: 80
 楼主| 发表于 2018-5-19 09:58:57 | 显示全部楼层
本帖最后由 meatball1982 于 2018-5-19 10:34 编辑
zjj179355 发表于 2018-5-18 17:09
您好,我想请问一下,如果颜色要表示概率密度,colorbar具体应该怎么做?谢谢! ...

帖子中有说明,作数据处理,只是因为那是个示意图,可以让出现点多的部分更加明显。如果就是想以概率画。不作-log,平移的处理,直接用网格中点出现的概率就行。
然后设置一下colorbar
fig_den_plot_percent.png
  1. clear all
  2. clc
  3. clf

  4. %% %%%%%%%%%%%%%%%%%%%%%%%%%
  5. % outline
  6. % plot point density
  7. %
  8. % 01.load points ---------------------------------
  9. % 02.calculate density ---------------------------
  10. % 03.post process --------------------------------
  11. % 04.output --------------------------------------

  12. %% main
  13. %
  14. % 01.load points ---------------------------------
  15. x=load('../data/x.txt');
  16. x(:,1)=[];
  17. y=load('../data/y.txt');
  18. y(:,1)=[];
  19. p=[x';y']';

  20. % 02.calculate density ---------------------------
  21. x_min=0;x_max=25;n_p_x=200;
  22. y_min=1.5;y_max=4.5;n_p_y=201;

  23. x_edge = linspace(x_min,x_max,n_p_x);
  24. y_edge = linspace(y_min,y_max,n_p_y);
  25. [X_edge,Y_edge]=meshgrid(x_edge,y_edge);
  26. ctrs{1}=x_edge;
  27. ctrs{2}=y_edge;
  28. hist_mat = hist3(p,'ctrs',ctrs);

  29. % 03.post process --------------------------------
  30. hist_mat = smooth2(hist_mat,3,3);
  31. hist_mat = hist_mat./sum(hist_mat(:));
  32. % hist_mat = -log(hist_mat);
  33. % tm = hist_mat(~isinf(hist_mat));
  34. % hist_mat(isinf(hist_mat))=max(tm);
  35. % shift_min = min(hist_mat(:));
  36. % hist_mat= hist_mat-shift_min;

  37. % 04.output var -----------------------------------
  38. xx = X_edge;
  39. yy = Y_edge;
  40. zz = hist_mat';

  41. % prob version
  42. % zz = zz./sum(zz(:));

  43. sbp_width=0.7;
  44. sbp_heig=0.8;
  45. n_row = 1;
  46. n_col = 1;
  47. [out_pos]=fun_mm_subplot_pos(n_row,n_col,sbp_width,sbp_heig);
  48. h=figure(1)
  49. set(h, 'Position', [1000, 100, 600, 400]);
  50. ax=axes('position',out_pos(1,:));

  51. hold on
  52. n_line=20;

  53. % delete very small value
  54. zz(zz<10^(-5))=nan;

  55. contourf(xx,yy,zz,n_line,'edgecolor','none')
  56. hidden off
  57. shading interp
  58. grid on
  59. box on
  60. colormap(flipud(jet))
  61. xlabel('I am x')
  62. ylabel('I am y')



  63. hb=colorbar;
  64. hb_ytick=hb.Ticks;
  65. percentsy = repmat('%8.3p', length(hb_ytick),1);
  66. for i = 1: length(hb_ytick)
  67.     yt=hb_ytick(i);
  68.     hb_yticklabel{i}=[num2str(100*yt),'%'];
  69. end

  70. set(hb,'Ticklabels',hb_yticklabel);
  71. ylabel(hb,'percentages')
复制代码


回复此楼 已获打赏: 0 积分

举报

新手

6 麦片

财富积分


050


0

主题

2

帖子

0

最佳答案
发表于 2018-5-19 13:29:30 | 显示全部楼层
谢谢大佬!!!!! 非常感谢
回复此楼 已获打赏: 0 积分

举报

新手

5 麦片

财富积分


050


0

主题

1

帖子

0

最佳答案
发表于 2019-9-14 11:13:56 | 显示全部楼层
为什么抑制显示未定义函数或变量smooth2
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

中级

570 麦片

财富积分


5001500


73

主题

1451

帖子

105

最佳答案
  • 关注者: 80
 楼主| 发表于 2019-9-16 08:58:05 | 显示全部楼层
matlabavizo 发表于 2019-9-14 11:13
为什么抑制显示未定义函数或变量smooth2

因为你只是复制那一段代码,而没有认真看帖子。
回复此楼 已获打赏: 0 积分

举报

MATLAB 基础讨论
版块优秀回答者

中级

570 麦片

财富积分


5001500


73

主题

1451

帖子

105

最佳答案
  • 关注者: 80
 楼主| 发表于 2019-9-16 09:18:53 | 显示全部楼层
一个例子,文章中的 Figure 4中的C。
就是相似的方式画出来的。

science.png
回复此楼 已获打赏: 0 积分

举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表