我正在尝试在极坐标轴上链接数据图像,这在 linkdata
文档的此处中对于笛卡尔坐标系的plot
/area
/...有很好的描述。
第一部分的代码根据 alpha 值制作了两个图像。
第二部分循环并在极坐标轴上绘制这些图像。
在第一次迭代后,linkdata on
激活,但我收到了通知,该通知没有像图1中那样提供 Fix it
选项。
我认为 bug 在于我无法明确定义 linkdata
的数据源为图像,参见 Attempt 1。
代码:
close all; clear all; clc;
af = figure('Name', 'Do Not Touch');
%% Data generation
f = figure;
hax = axes(f);
rgb = 'peppers.png';
% http://blogs.mathworks.com/steve/2009/02/18/image-overlay-using-transparency/
rgb = imread('peppers.png');
I = rgb2gray(rgb);
h = imagesc(I, 'Parent', hax);
[M,N] = size(I);
block_size = 50;
P = ceil(M / block_size);
Q = ceil(N / block_size);
alpha_data = checkerboard(block_size, P, Q) > 0;
alpha_data = alpha_data(1:M, 1:N);
set(h, 'AlphaData', alpha_data.^2);
zeroFigureDecorations(hax);
images{1} = getframe(hax);
[M,N] = size(I);
block_size = 50*2;
P = ceil(M / block_size);
Q = ceil(N / block_size);
alpha_data = checkerboard(block_size, P, Q) > 0;
alpha_data = alpha_data(1:M, 1:N);
set(h, 'AlphaData', alpha_data.^2);
images{2} = getframe(hax);
close all;
clearvars -except images;
%% Polar
% http://stackoverflow.com/a/40063951/54964
fp=figure('Name', 'Test', ...
'Position',[200 200 851 404],'Resize','off'); % only half circle on polaraxes although warp can do eclipses
ThetaTicks = 0*pi:pi/10:1*pi;
pax = polaraxes( 'ThetaAxisUnits', 'radians', ...
'ThetaLim',[min(ThetaTicks) max(ThetaTicks)],...
'Color','none',...
'GridAlpha',1,...
'GridColor',[1 1 1],...
'ThetaTick', ThetaTicks, ...
'ThetaDir', 'counterclockwise', ...
'Parent', fp);
imax = axes('Parent', fp, 'Visible', 'off');
zeroFigureDecorations(imax);
for image=images
h = imagesc(image{1}.cdata, 'Parent', imax);
zeroFigureDecorations(imax);
linkdata on;
angleRadians=-pi;
I = getframe(pax);
I = I.cdata;
[x, y, z]=makePolar(I, angleRadians);
imax.Children = warp(x, y, z, I);
set(imax,'view',[-180 -90],'Visible','off');
axis(imax,'tight')
pause(0.5);
end
function zeroFigureDecorations(ax)
axis(ax, 'tight');
set(ax, 'yTickLabel', []);
set(ax, 'xTickLabel', []);
set(ax, 'Ticklength', [0 0]); % https://dev59.com/jmUp5IYBdhLWcg3wF0dq#15529630
colormap(ax, gray(1024));
box(ax, 'off');
axis(ax, 'off');
end
图1. 单个图像在极轴上正确显示,这里是第二次迭代后;顶部栏显示了失败的linkdata
尝试,并且没有像通常一样提供Fix it
选项。
尝试1
显式设置guihandles
和datasources
,但可能没有效果,因为没有在图像上作为数据源明确应用linkdata
。
...
myhandles = guihandles(fp);
for image=images
h = imagesc(image{1}.cdata, 'Parent', imax);
myhandles.output = h;
myhandles.yData = [];
myhandles.xData = [];
set(get(myhandles.xData, 'Children'), 'XDataSource', myhandles.xData);
set(get(myhandles.yData, 'Children'), 'YDataSource', myhandles.yData);
...
end
MathWorks 联系方式
MATLAB 反馈论坛回答:
简短的回答是 polaraxes 支持数据链接,但是看起来您正在使用 warp,它创建了一种不支持数据链接的表面对象。有一些解决方法,例如您可以修改 warp.m 文件,使用 surf 而不是 surface。
我正在处理有关此主题的服务请求。
MATLAB:2016b
操作系统:Debian 8.5
MathWorks 服务请求号:#02229120
Parent, hax
)。 - Ander Biguri