查看: 7312|回复: 2|关注: 0

[我分享] 豆粑粑 三维散点 根据点密度画等值曲面 contour3D

[复制链接]

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

中级

571 麦片

财富积分


5001500


73

主题

1452

帖子

105

最佳答案
  • 关注者: 84
发表于 2017-3-16 15:38:25 | 显示全部楼层 |阅读模式
本帖最后由 meatball1982 于 2017-3-16 19:48 编辑

空间散点,根据点密度画图。在3维空间中等高值曲面显示。
这个问题经常被问到,其它软件也有相似的实现。
记录下来,给以后的我\footnote{如果能活到再次使用这类图的时候}以帮助。
数据,m文件附件上传。
fig_01_points.png fig_03_contour_3D.png fig_02_surf.png
  1. clear all
  2. clc
  3. close all

  4. %% outline
  5. % plot scatter points, surf, countour3D

  6. %% main
  7. % load data ---------------------------------------------------------------
  8. dat=load('cv_357.txt');
  9. n=length(dat(:,1));

  10. x=dat(:,1);
  11. y=dat(:,2);
  12. z=dat(:,3);

  13. % grid size ---------------------------------------------------------------
  14. n_cv=30;
  15. cv_g=linspace(-pi,pi,n_cv);

  16. cv_int=0.5; % 2 calculate point denisty, half of cubic size
  17. cv_x=cv_g;
  18. cv_y=cv_g;
  19. cv_z=cv_g;

  20. [cv_X,cv_Y,cv_Z]=meshgrid(cv_g,cv_g,cv_g);

  21. % points denisty ----------------------------------------------------------
  22. for i=1:n_cv
  23.     ind_x= (x>=cv_x(i)-cv_int) & (x<cv_x(i)+cv_int);
  24.     for j=1:n_cv
  25.         ind_y= (y>=cv_y(j)-cv_int) & (y<cv_y(j)+cv_int);
  26.         for k=1:n_cv
  27.             ind_z= (z>=cv_z(k)-cv_int) & (z<cv_z(k)+cv_int);
  28.             p_n = sum(ind_x & ind_y & ind_z);
  29.             cv_V(j,i,k)= p_n;
  30.         end
  31.     end
  32. end

  33. % %% 4 conv
  34. % save Mat_post_3D_contour.mat
  35. %
  36. % load Mat_post_3D_contour.mat
  37. % 2 smooth the points density, change 1 to 3, or 5 or 7 according to your
  38. % data
  39. cv_V=smooth3(cv_V,'box',1);

  40. %% original points --------------------------------------------------------
  41. figure(1)
  42. plot3(x,y,z,'.')
  43. axis([-pi pi -pi pi -pi pi])

  44. axis equal tight
  45. view(20,20)
  46. box on
  47. ax=gca;
  48. ax.BoxStyle = 'full';

  49. %% surf version -----------------------------------------------------------

  50. figure(2)
  51. hold on
  52. for i=1:3:n_cv
  53.     surf( cv_X(:,:,i),cv_Y(:,:,i),cv_Z(:,:,i),cv_V(:,:,i),...
  54.         'edgecolor','none','facealpha',0.05+0.01*i)
  55. end
  56. axis([-pi pi -pi pi -pi pi])
  57. colormap(flipud(jet))

  58. axis equal tight
  59. view(20,20)
  60. box on
  61. ax=gca;
  62. ax.BoxStyle = 'full';

  63. %% contour3D --------------------------------------------------------------
  64. figure(3)
  65. n_layer=9; % layer number
  66. col_mm=flipud(jet(n_layer)); % color map

  67. lev_add=2.3.^[2:n_layer+1]; % which layer you want to plot
  68. lev_beg=80;                 % begin layer

  69. % contour 3D with each layer
  70. for i = 1: n_layer
  71.     mm_lev=lev_beg+lev_add(i);
  72.     p1 = patch(isosurface(cv_V,mm_lev),'FaceColor',col_mm(i,:),...
  73.     'EdgeColor','none','FaceAlpha',0.1+0.015*i);
  74.     isonormals(cv_V,p1);
  75. end
  76. % other setting
  77. axis equal
  78. view(20,20);
  79. axis vis3d equal tight
  80. camlight headlight;
  81. lighting phong
  82. set(gca,'GridLineStyle',':')
  83. box on
  84. ax=gca;
  85. ax.BoxStyle = 'full';
  86. grid on



  87. %% logs
  88. % typed by : mm
  89. % mod : 2017年 03月 16日 星期四 15:23:22 CST
  90. % contact me : meatball1982@163.com
  91. %
复制代码




补充内容 (2019-9-17 14:08):
这只是提供一个画4D数据的思路,其中的V不一定必需是点的密度,也可以是你自己定义的值。这个点的强度啊。这个点位置上的随便一个物理量。

cv_357.txt.zip

99.47 KB, 下载次数: 205

data

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

举报

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

中级

571 麦片

财富积分


5001500


73

主题

1452

帖子

105

最佳答案
  • 关注者: 84
 楼主| 发表于 2017-9-20 09:08:24 | 显示全部楼层
更新:
对于散点的统计图(4D),习惯于用slice来实现。并把每个slice设置为一定的透明。
file_3d_grid_hot.png
  1. clear all
  2. clc
  3. close all

  4. %% outline
  5. % plot scatter points, surf, countour3D, slice

  6. %% main
  7. % load data ---------------------------------------------------------------
  8. % dat=load('./cv_357.txt');
  9. % n=length(dat(:,1));
  10. %
  11. % x=dat(:,1);
  12. % y=dat(:,2);
  13. % z=dat(:,3);
  14. %
  15. % % grid size ---------------------------------------------------------------
  16. % n_cv=30;
  17. % cv_g=linspace(-pi,pi,n_cv);
  18. %
  19. % cv_int=0.5; % 2 calculate point denisty, half of cubic size
  20. % cv_x=cv_g;
  21. % cv_y=cv_g;
  22. % cv_z=cv_g;
  23. %
  24. % [cv_X,cv_Y,cv_Z]=meshgrid(cv_g,cv_g,cv_g);
  25. %
  26. % % points denisty ----------------------------------------------------------
  27. % for i=1:n_cv
  28. %     ind_x= (x>=cv_x(i)-cv_int) & (x<cv_x(i)+cv_int);
  29. %     for j=1:n_cv
  30. %         ind_y= (y>=cv_y(j)-cv_int) & (y<cv_y(j)+cv_int);
  31. %         for k=1:n_cv
  32. %             ind_z= (z>=cv_z(k)-cv_int) & (z<cv_z(k)+cv_int);
  33. %             p_n = sum(ind_x & ind_y & ind_z);
  34. %             cv_V(j,i,k)= p_n;
  35. %         end
  36. %     end
  37. % end
  38. %
  39. % save Mat_cv.mat

  40. load Mat_cv.mat
  41. cv_V=smooth3(cv_V,'box',3);

  42. % potential( u can mod the value with your style  ---------------------
  43. cv_V=-log(cv_V./sum(cv_V(:)));
  44. tm = cv_V(cv_V~=Inf);
  45. cv_V(cv_V==Inf)=max(tm);
  46. cv_V=cv_V-min(cv_V(:));
  47. cv_V(cv_V>3.7)=NaN;

  48. % slice u want 2 plot ---------------------------------------
  49. xslice =  cv_x(1:1:n_cv);
  50. yslice =  cv_y(1:1:n_cv);
  51. zslice =  cv_z(1:1:n_cv);

  52. h=slice(cv_X,cv_Y,cv_Z,cv_V,xslice,yslice,zslice);
  53. for i = 1:3*n_cv
  54. set(h(i),'EdgeColor','none','FaceColor','interp',...
  55.    'FaceAlpha',0.01+0.008*(n_cv-mod(i,n_cv))) ;
  56. end

  57. % set only one alpha value ----------------------------------
  58. % set(h,'EdgeColor','none','FaceColor','interp',...
  59. %    'FaceAlpha',0.2) ;

  60. % choose the colormap u want ---------------------------------
  61. colormap(flipud(hot))
  62. % colormap((hot))

  63. % just figure setting -----------------------------------------
  64. axis tight equal
  65. set(gca,'GridLineStyle',':')
  66. box on
  67. ax=gca;
  68. ax.BoxStyle = 'full';
  69. grid on
  70. axis([-pi pi -pi pi -pi pi])
  71. view(20,20)

  72. h = gcf;
  73. fig_na=['./file_3d_grid_hot'];
  74. fun_work_li_035_myfig_out(h,fig_na,3)

  75. %% logs
  76. % mod : 2017年 09月 20日 星期三 09:15:39 CST
  77. % if u have question about this code. contact me
  78. % meatball1982@163.com
  79. %
复制代码





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

举报

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

中级

571 麦片

财富积分


5001500


73

主题

1452

帖子

105

最佳答案
  • 关注者: 84
 楼主| 发表于 2020-10-16 16:51:57 | 显示全部楼层
一个新的要求,把不同等值面的点,通过不同散点(color)画出来。
对应的等值面,也画出来。 fig_04_scatter3d_color.png
fig_05_contourf.png

work_plot_3D.m

3.43 KB, 下载次数: 1

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

举报

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

本版积分规则

关闭

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

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