
logarithmic range colorbar imagesc
조회 수: 20 (최근 30일)
이전 댓글 표시
In my code I use the function imagesc; plotting (X,Y,Z) data in which: X vector distance, Y vector time, and my data Z = Z(X,Y) a matrix. In my plot the 80% of the image has one color, because the change of Z data occurred only in a specific area of X-Y. I need to change the colorbar range, from a normal to a logarithmic one, to improve visual the range of the change of my output data through time along the distance X. Please, if anyone knows how to solve this issue let me know.
댓글 수: 0
답변 (3개)
Kelly Kearney
2015년 11월 9일
You can use my cptcmap.m function to create a logarithmically-spaced colormap (and corresponding colorbar).
However, keep in mind that Matlab requires linearly-spaced color intervals in its colormaps, so my function achieves uneven color intervals by replicating certain colors many times. You may not get the results you want if your values span too many orders of magnitude. For example, to create a colormap where one color spans only 1/1000th of the color range, you need a 1000-color colormap. I believe some systems (Windows?) may limit you to 256 colors in a colormap.
However, if your values span a relatively small range, the following example should work:
x = peaks(200);
x = (x - min(x(:)))./(max(x(:))-min(x(:)));
x = x*9 + 1;
tk = logspace(0,1,10);
cmap = jet(9);
ctable = [tk(1:end-1)' cmap*255 tk(2:end)' cmap*255];
save mycol.cpt ctable -ascii;
ax = axes;
imagesc(x);
cptcmap('mycol', 'mapping', 'direct');
cptcbar(gca, 'mycol', 'eastoutside', false);

댓글 수: 4
Image Analyst
2015년 11월 9일
Use caxis() to specify what image values the colorbar should start at and stop at.
Adam
2015년 11월 9일
편집: Adam
2015년 11월 9일
I would normally solve this problem simply by taking the logarithm of my data and plotting that if simply constraining the colourbar range is not enough.
I'm not sure there is a simply way to show a non-linear colourmap without creating your own colourmap. The mapping is always linear as far as I am aware which would imply you can either make your data logarithmic or you can define a logarithmic colourmap yourself. I don't know how to do the latter off-hand though.
댓글 수: 6
Adam
2015년 11월 10일
I don't really want to download data from a random site (you can attach to a comment here), but for general data in that range...
Having data from -100 to 100 is not a problem. You can abs the negative data, take its logarithm and then reintroduce the sign afterwards - e.g.
signs = sign( data );
logData = signs .* log( abs( data ) );
I'm not sure what the issue with NaNs is either. If you have NaNs in your data then log( NaN ) is also NaN anyway so you don't lose anything that way from what you started with.
0s would be a problem but you can easily use logical indexing to reinsert all the 0s into your log data in the same places they were in the original data.
참고 항목
카테고리
Help Center 및 File Exchange에서 Blue에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!