问题描述:
我的数据是四列[x,y,z,c],根据c值的变化颜色也应相应变化。我要画一个三维图像,图上呈现颜色随数据变化而变化的现象。我的c值的变化范围是[1.0e-20 3.5e-16],相差10的6次方,所以数值之间的差异还是比较大的。其中大部分数据为0,其他非零的数值集中在1.0e-20和3.5e-16附近。目标是要使得随着非零数值的变化颜色也要相应的变化,人眼要能够看到这种变化,零值与非零值要能够较明显地区分。使用通常的画图方法难以体现颜色随着c值的变化而变化。
初始绘图方法:
scatter3(x,y,z,10,c,'filled'); caxis([1.0e-22 3.5e-16]); colormap('jet'); colorbar;
存在问题:
colormap默认只有64种RGB的组合,可以使用map = colormap;查看map的值得到。这样的话,由于在colorbar中1.0e-22与0相当接近,导致1.0e-22附近的非零值与0在三维图形中的颜色几乎是一样的,无法区别。无法达到我的要求。
colormap name除了jet外还有很多可选的,如下图:
选择jet是因为,jet的颜色从蓝到红,有一个渐变的过程,而我正需要这样一个渐变的过程,而且包含的颜色较为丰富。
改进方法:
scatter3(x,y,z,10,c,'filled'); caxis([1.0e-22 3.5e-16]); colormap(jet(1e+6)); map = colormap; map(1,:) = [0 0 0]; colormap(map); colorbar;
colormap(jet(1e+6));这句话表示此时将有10的6次方种RGB组合,此时颜色一下就丰富起来了,虽然相对于10的22次方还是有一定的差距。不过在图形上已经可以较好的进行颜色区分了。注意RGB组合值不应该设置得过大,我一开始设置为10的10次方直接就被提示超过了表示范围。使用10的9次方时,电脑马上就死机了,在下只好强制关机重启。最后还是选择了10的6次方,10的7次方也可以,不过会慢一些,毕竟在下的电脑比较渣就不逞这个强了。
map(1,:) = [0 0 0]将1.0e-22对应的颜色设置为黑色。小于1.0e-22的值都是黑色。而上图jet没有黑色,所以这样就将0值和非零值较好的区分开了。左端值设置为1.0e-22是为了保证c值的变化范围是[1.0e-20 3.5e-16]的左端值不会是黑色。
总结:
matlab图形功能还是很强大的,里面还有很多函数我都还没有来得及看,慢慢学习。此次主要需要了解colormap的相关使用方法,建议大家多看看MATLAB使用手册上面的相关说明,一定会有所收获。
学海无涯,苦中作乐。