标签: matlab-hg2

重绘在2014b中保存在2013b中的图形

由于MATLAB在R2014b中改变了它的数字引擎,我决定重新运行我的一些代码,以便从中获得更好看的数据.不幸的是,我拥有的最后一个代码需要很长时间才能运行,我想高度避免重新运行代码以获得更好的数字.

我将结果保存.fig在R2013b 的文件中.但是,如果我在R2014b中打开它,它仍然具有旧格式.

是否可以使用MATLAB R2014b绘图引擎重绘图形?如果是的话,我怎么能这样做?

注意:从字面上看,图形是使用新引擎打开和绘制的,但是,它保留了旧格式.虽然带有title()命令的新图形会绘制一个漂亮的大而粗的标题,如果使用"drawow"重绘这个图形或者我为它生成代码,格式保持不变.

示例:此图是在2013b中创建的,并在2014b中重新绘制.您可以看到标题的绘图格式title('whatever')与新图形句柄中的绘图格式不同.它看起来像'.fig'保存并设置它生成的版本的默认值.因此,重绘时,绘图颜色,标题,标签等看起来就像旧的图形句柄.

在此输入图像描述

这可以使用以下代码进行测试.请注意,这是一个过于简化的问题,问题不是关于标题或标签,而是一般的所有图形内容.

rng(1)


figure()
x = 1:50;
y = rand(1, 50);

plot(x,y)
title('this NICE Title')
xlabel('labels!')
ylabel('some other labels','Interpreter','Latex')
Run Code Online (Sandbox Code Playgroud)

如果此代码在2013b和2014b中运行,在两者中保存为fig,然后在两者中打开,则显示下两个数字:

在此输入图像描述 在此输入图像描述

2013b图文件:http://s000.tinyupload.com/index.php?file_id = 02053933004513599550

matlab matlab-figure matlab-hg2

19
推荐指数
1
解决办法
713
查看次数

如何在MATLAB R2014b中访问PropertyEvent的新值?

背景

在MATLAB的早期版本中(例如R2013b),我有一个巧妙的技巧,我将一个监听器附加到一个轴句柄的YLim属性,当轴y-limits被改变时它会通知我:

addlistener(gca, 'YLim', 'PreSet', @(src,ev_data) disp(ev_data.NewValue))
Run Code Online (Sandbox Code Playgroud)

我正在使用它来更新第二个数字,它会显示这些轴中可见数据子集的一些摘要统计数据.这太棒了!你放大,第二个数字自我更新.大.

使它成为一个PreSet(而不是PostSet)监听器是有用的,因为我可以检查新值是否与旧值相同,从而避免在不必要时重新计算这些统计信息.

问题

但是,这在R2014b中不再适用于我.我能够附加事件监听器,但是当我触发事件时,我收到以下错误消息:

类event.PropertyEvent没有适当的方法,属性或字段NewValue.

我相信这与HG2图形系统有关.通过适当的断点,我们可以查看事件数据.在R2013b:

K>> ev_data
ev_data =
    handle.PropertySetEventData

K>> get(ev_data)
              Type: 'PropertyPreSet'
            Source: [1x1 schema.prop]
    AffectedObject: [1x1 axes]
          NewValue: [0.5000 220.5000]
Run Code Online (Sandbox Code Playgroud)

在R2014b中,我们似乎错过了这个NewValue领域:

K>> ev_data
ev_data = 
  PropertyEvent with properties:

    AffectedObject: [1x1 Axes]
            Source: [1x1 matlab.graphics.internal.GraphicsMetaProperty]
         EventName: 'PreSet'
Run Code Online (Sandbox Code Playgroud)

它去哪儿了?!当然必须有一种方法来访问它.如果您无法访问要尝试将其设置为的新值,则属性预设事件处理程序有点无用.

matlab matlab-figure matlab-class matlab-hg2

10
推荐指数
1
解决办法
535
查看次数

MATLAB:导出为矢量图形后可见的补丁边缘

Matlab中的补丁从单个三角形粘合在一起.它们的边缘通常是不可见的,但是当我以矢量图形格式导出图形时,可以清楚地看到它们(不是显示整个图像,只是放大部分)

各个三角形的边缘

生成此MWE的代码是:

xx = [0:1:100, 100:-1:0];
yy = [zeros(1,101), ones(1,101)];
p1 = patch(xx,yy,'b'); 
print('testPatch','-dpdf','-painters')
Run Code Online (Sandbox Code Playgroud)

替代功能fill表现相同.有没有办法避免这个错误,或者在这种情况下我是否必须使用位图?

编辑:一个解决方法是孵化该区域而不是填充它.这显然并非总是可行,但在我的情况下,它工作得很好,我可以坚持使用矢量图形.相关的FEX提交是http://www.mathworks.com/matlabcentral/fileexchange/30733-hatchfill

matlab vector-graphics matlab-hg2

7
推荐指数
1
解决办法
650
查看次数

绘制顶轴(方框)线

我有一个有两条线和两个不同的x轴(不同的数据单元)的情节,我的情节如下所示.

我的问题是我想把盒子的顶部线条也画成黑色(水平),而不是像它那样"开放".如果线具有x轴刻度也是很好的,与底部水平轴线相同.

显然,grid on不起作用,因为它在右侧绘制y1轴刻度,在左侧绘制y2轴刻度,这是我不想要的.

另外,我认为在Matlab 2014中,这有效:set(ax(2),'XAxisLocation','top','XTickLabel',[]);但它在Matlab 2015a中已不复存在了.

这是一个例子:

figure(1);
x = [0, 1, 2, 3];
y_1 = [3, 2, 1.5, 1];
y_2 = [0, 0.5, 0.7, 0.9];
parula_blue = [0, 0.447, 0.741]; parula_red = [0.85, 0.325, 0.098];

[ax, h1, h2] = plotyy(x, y_1, x, y_2);
set(get(ax(1),'Ylabel'),'String','Data 1', 'Color', 'k');
set(h1,'LineWidth',2,'LineStyle','-','Color',parula_blue,'DisplayName', 'Name 1');
set(ax(1),'ycolor',parula_blue);
set(ax(1), 'YTick', [0 1 2 3 4]);
set(ax(1), 'ylim', [0 4]);

set(get(ax(2),'Ylabel'),'String','Data 2', 'Color', 'k');
set(h2,'LineWidth',2,'LineStyle','--','Color',parula_red,'DisplayName','Name 2');
set(ax(2),'ycolor',parula_red);
set(ax(2),'YDir','reverse');
set(ax(2), 'YTick', [0 0.2 …
Run Code Online (Sandbox Code Playgroud)

matlab matlab-figure matlab-hg2

6
推荐指数
1
解决办法
742
查看次数

MATLAB 2014b及以上版本中带有画家渲染器的三角形拆分补丁

MATLAB的新图形引擎HG2无法使用画家渲染器正确打印补丁:

hist(randn(1,1000)); 
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
Run Code Online (Sandbox Code Playgroud)

将所得的贴剂,无论是通过产生histcolorbar,具有三角形分割:

补丁中的三角形分裂

这里这里已经讨论了MATLAB Central的问题,其中建议禁用pdf-viewer中的"smooth line art"选项应该解决它.这隐藏了一些读者的问题(例如在Adobe Reader中但在Apple Preview中没有),但要求协作者和读者使用特定的pdf查看器以及图形的非默认设置才能正确显示,这几乎不是一个解决方案.查看Inkscape中的结果文件,很明显分割存在于输出矢量图形中.在这里,我移动了一半的colorbar,证明它实际上是分成两半,而不仅仅是被pdf-viewer误解了:

在此输入图像描述

使用OpenGL渲染器不存在问题(print('test.pdf','-opengl')但是输出没有矢量化).这个问题在MATLAB 2015a中仍然存在.

有没有办法在MATLAB 2014b或更高版本中导出无伪影的矢量图形?

pdf matlab matlab-hg2

6
推荐指数
1
解决办法
1277
查看次数

MATLAB R2014b:在同一位置使用线条绘制图形

从版本R2014b开始,MATLAB现在渲染图形很好地消除锯齿(最后!)

然而,这会导致显示我的一些数字的方式出现故障.如果我绘制一条线,使用hold on然后在不同颜色的完全相同的位置绘制另一条线,则该线以两种颜色的斑驳组合出现.在过去,该线条将简单地显示为在该位置绘制的最后一种颜色.

以下是蓝色迹线的示例,其中一些部分(较陡的位)显示绿线.在以前的MATLAB版本中,绿线将是连续的,但现在一些蓝线显示出来.

在此输入图像描述

在新版本中是否有一种巧妙的解决方法,或者我必须确保在绘制到同一个地方之前删除任何现有的行?

matlab plot matlab-figure matlab-hg2

5
推荐指数
1
解决办法
283
查看次数

如何在MATLAB 2014b中增加散点图中图例的标记大小?

我在散点图中找到了标记大小,并且图例在MATLAB 2014b中有所不同.我搜索并找到了早期版本MATLAB的一些解决方案,这些解决方案不适用于最新版本.在我当前的版本中,图例中的标记大小非常小,几乎无法区分.有帮助吗?

figure; 
hold on 
s1 = scatter(1, 1, 150, 'k', 'o') 
s2 = scatter(1, 2, 150, 'k', '+') 
s3 = scatter(2, 1, 150, 'k', 'x') 
h = legend('Circle', 'Plus', 'X', 'Location', 'NorthEast'); 
set(h, 'FontSize', 14) 
axis([0 3 0 3]) 
Run Code Online (Sandbox Code Playgroud)

散点图和图例中的标记大小不同.如何增加图例条目的标记大小并使其类似于散点图的标记大小.

matlab scatter legend legend-properties matlab-hg2

5
推荐指数
1
解决办法
1万
查看次数

在Matlab R2014b +(HG2)上获得可靠的渲染

我无法以可靠的方式制作出Matlab新的图形引擎(HG2)显示行和标记,这意味着在轴/屏幕中的每个地方都可以相同地显示/呈现.

为了证明这个问题,我编写了一个简单的脚本(参见文章末尾),并将R2014a(使用Matlab旧HG1引擎)与R2016b(因此使用Matlab新HG2引擎)下的结果进行了比较,两者均用于画家opengl渲染器.

(您可能会在脚本中注意到我已经尝试停用我所知道的任何类型的HG2平滑.尽管这确实会改变一些事情,但是描述的一般问题行为是否会发生平滑处理.)

图的视图

(我担心这样会调整图像的大小,从而导致图像失败,所以这里是图像本身的直接链接)

  • R2014a(HG1)和画家渲染器:如果你放大图像,你可以检查每个标记都是像素完美的 - 无论它们在哪里被绘制,它们都是完全相同的.每条绿线正好是1像素宽.

  • R2014a(HG1)&opengl渲染器:每条绿线正好是1像素宽,但标记不显示/绘制彼此相同.

  • R2016b(HG2)&painters renderer:奇怪的是,与HG1和opengl的结果相似.线是正确的宽度(显示与HG1略有不同,但至少它们是一致的),但标记在整个轴上不同.

  • R2016b(HG2)和opengl渲染器:标记都是相同的(尽管我喜欢它们较少,这是一个主观问题,重要的是它们都是相同的),但你可以看到三条绿线并非所有预期的宽度1像素:顶部和底部宽度为2像素,仅绘制中间宽度为1像素的像素.

关于如何使两个渲染器中的任何一个在HG2中表现正确(即在图像中的任何位置绘制相同的东西)的任何想法?

其他注意事项:

  • 如果可能的话,我更愿意使用opengl,因为出于某种原因,画家看起来非常慢(至少是相机控制)甚至是"合理"数量的数据点(即数千)与HG2.当然,除非你知道如何使画家在HG2一样快,因为它在HG1.

  • 虽然测试代码很简单,但实际上我需要在非常精细的GUI(自定义uimenu,uicontrols,面板,回调等)中使用它.虽然我不知道这可能很重要,但显然,例如,使用uifigure而不是图形的潜在解决方案对我来说是不可行的.

  • 有关信息,这是我输入时得到的opengl('info'):

在Matlab R2014a中:

Version         = 4.0.0 - Build 9.18.10.3131
Vendor          = Intel
Renderer        = Intel(R) HD Graphics 4600
MaxTextureSize  = 8192
Visual          = 05 (RGB 32 bits(08 08 08 08) zdepth 24, Hardware Accelerated, Opengl, Double Buffered, Window)
Software        = false
# of Extensions = 139

Driver Bug Workarounds:
OpenGLBitmapZbufferBug    = …
Run Code Online (Sandbox Code Playgroud)

matlab pixel-perfect rasterizing matlab-figure matlab-hg2

5
推荐指数
1
解决办法
131
查看次数

显示多个数据时出现错误错误

所以我需要在图中绘制一些errobar情节.具体来说,我需要errorbar在每个图中有4个图,问题是当绘制多个数据时,图形有点不可读.

例:

clear all
close all
clc



x = 0:pi/10:pi;
y = sin(x);
y2=cos(x);
y3=atan(x);
e = std(y)*ones(size(x));
e2 = std(y2)*ones(size(x));
e3 = std(y3)*ones(size(x));

figure
hold on
errorbar(x,y,e)
errorbar(x,y2,e2)
errorbar(x,y3,e3)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我解决这个问题的想法是填充错误条的角用界面的相同颜色和低alpha划分的区域,这样区域的重叠是可见的.

问题是,我能想象到的唯一方法是在由错误栏角分隔的区域中创建一个网格,然后填充它们patch.这确实是可能的,但非常烦人,因为绘图不会有凸包,因此我需要迭代地逐个创建三角形.所以问题是:有更优雅的方式吗?

此外,如果有人的话,我愿意接受更好的可视化数据的建议.

matlab plot matlab-figure matlab-hg2

3
推荐指数
1
解决办法
952
查看次数