【问题标题】:Setting alpha of colorbar in MATLAB R2015b在 MATLAB R2015b 中设置颜色条的 alpha
【发布时间】:2016-09-22 06:13:03
【问题描述】:

我想在我的情节中设置一些透明度,我可以使用alpha 来做到这一点。这很好用,但我也想调整颜色条。这是一个例子:

subplot(2,1,1)
A = imagesc(meshgrid(0:10,0:5));
alpha(A,1)
colorbar

subplot(2,1,2)
B = imagesc(meshgrid(0:10,0:5));
alpha(B,.1)
colorbar

示例取自here。在此页面上存在两个解决方案,但没有一个适用于 Matlab R2015b。

【问题讨论】:

  • 你试过hb = colorbar; alpha(hb, .1);吗?
  • @MadPhysicist 是的,这不起作用。

标签: matlab alpha colorbar


【解决方案1】:

使用 HG2 图形 (R2014b+),您可以获得一些未记录的底层绘图对象并更改透明度。

c = colorbar();

% Manually flush the event queue and force MATLAB to render the colorbar
% necessary on some versions
drawnow

alphaVal = 0.1;

% Get the color data of the object that correponds to the colorbar
cdata = c.Face.Texture.CData;

% Change the 4th channel (alpha channel) to 10% of it's initial value (255)
cdata(end,:) = uint8(alphaVal * cdata(end,:));

% Ensure that the display respects the alpha channel
c.Face.Texture.ColorType = 'truecoloralpha';

% Update the color data with the new transparency information
c.Face.Texture.CData = cdata;

您必须小心执行此操作,因为颜色条会不断刷新,并且这些更改不会持续。为了让他们在我打印图形时留下来,我只是将FaceColorBinding 模式更改为interpolated 之外的其他内容

c.Face.ColorBinding = 'discrete';

这意味着当您更改颜色限制或颜色图时,它不会更新。如果您想更改其中任何一项,您需要将ColorBinding 重置为intepolated,然后再次运行上述代码。

c.Face.ColorBinding = 'interpolated';

例如,以下将保存具有两个颜色图的透明颜色条的图像:

c = colorbar();

drawnow;

alphaVal = 0.1;

% Make the colorbar transparent
cdata = c.Face.Texture.CData;
cdata(end,:) = uint8(alphaVal * cdata(end,:));
c.Face.Texture.ColorType = 'truecoloralpha';
c.Face.Texture.CData = cdata;

drawnow

% Make sure that the renderer doesn't revert your changes
c.Face.ColorBinding = 'discrete';

% Print your figure
print(gcf, 'Parula.png', '-dpng', '-r300');

% Now change the ColorBinding back
c.Face.ColorBinding = 'interpolated';

% Update the colormap to something new
colormap(jet);

drawnow

% Set the alpha values again
cdata = c.Face.Texture.CData;
cdata(end,:) = uint8(alphaVal * cdata(end,:));
c.Face.Texture.CData = cdata;

drawnow

% Make sure that the renderer doesn't revert your changes
c.Face.ColorBinding = 'discrete';

print(gcf, 'Ugly_colormap.png', '-dpng', '-r300');

【讨论】:

  • 不知何故这对我不起作用。我收到错误“下标索引必须是真正的正整数或逻辑。”因为 size(cdata ) = [0 0].
  • @machinery 嗯,很奇怪。什么操作系统?
  • 我有 Windows 10,64 位。
  • @machinery 你是想打印还是只显示它,就像我在第一个示例中所做的那样?
  • 如果我使用 c = colorbar 而不是 c = colorbar(); 它可以工作,但我看不到颜色条有任何影响。如果我在c = colorbar 之后直接插入c.Face.ColorBinding = 'discrete'; ,我会收到警告“警告:更新四边形时出错。此功能尚未实现”并且颜色栏为空。
【解决方案2】:

解决方案表单 Suever 可以工作,但是在实时编辑器 (R2020b) 中工作时,我必须添加:

set(gcf,'Visible','on')

这使得图形被绘制在外部弹出窗口中。然后它确实有效,但我不知道为什么。

实时编辑器的工作示例:

figure(1);clf;
set(gcf,'Visible','on')
c = colorbar();
drawnow;
alphaVal = 0.5;

% Make the colorbar transparent
cdata = c.Face.Texture.CData;
cdata(end,:) = uint8(alphaVal * cdata(end,:));
c.Face.Texture.ColorType = 'truecoloralpha';
c.Face.Texture.CData = cdata;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多