Resize plot to fit text
조회 수: 35 (최근 30일)
이전 댓글 표시
Is it possible to resize the y-axis automatically, so that my text always fits in the plot.
(as far as I can see, it is not clearly possible by using the "axis" and "ylim" functions)
댓글 수: 3
채택된 답변
Adam Danz
2019년 12월 9일
편집: Adam Danz
2019년 12월 9일
- Get the extent of the text objects after plotting the text.
- Add the vertical position and height to get the upper position of each text object
- Adjust the y axis limit so it contains all text objects.
h = text(1:numel(y),y,strsplit(num2str(y)),'VerticalAlignment','bottom');
ext = cell2mat(get(h,'Extent')); % Step 1
upperPosition = sum(ext(:,[2,4]),2); % Step 2
ylim([min(ylim()),max(max(ylim()),max(upperPosition))]) % step 3
The y limit will be adjusted so that it maintains its current lower limit and increases its upper limit only if there is text that exceeds the axis boundaries.
Result
[update]
That could be reduced to one line where h is the handle to the text output.
ylim([min(ylim()), max(max(ylim()),max(cellfun(@(x)sum(x([2,4])),get(h,'Extent'))))])
It could also be put into an anonymous function where the two inputs are h and ax which are the text handles and the axis handle.
fitText = @(ax,h)ylim(ax,[min(ylim(ax)), max(max(ylim(ax)),max(cellfun(@(x)sum(x([2,4])),get(h,'Extent'))))]);
fitText(gca,h)
댓글 수: 1
Adam Danz
2019년 12월 9일
The full code to produce the figure, text and y limits:
clf()
y = [1.6, 1.7, 2];
bar(y)
axis tight
h = text(1:numel(y),y,strsplit(num2str(y)),'VerticalAlignment','bottom');
ext = cell2mat(get(h,'Extent')); % Step 1
upperPosition = sum(ext(:,[2,4]),2); % Step 2
ylim([min(ylim()),max(max(ylim()),max(upperPosition))]) % step 3
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Annotations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!