由于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的早期版本中(例如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中的补丁从单个三角形粘合在一起.它们的边缘通常是不可见的,但是当我以矢量图形格式导出图形时,可以清楚地看到它们(不是显示整个图像,只是放大部分)

生成此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
我有一个有两条线和两个不同的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的新图形引擎HG2无法使用画家渲染器正确打印补丁:
hist(randn(1,1000));
colorbar('Location','SouthOutside');
print('test.pdf','-dpdf');
Run Code Online (Sandbox Code Playgroud)
将所得的贴剂,无论是通过产生hist或colorbar,具有三角形分割:

这里和这里已经讨论了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或更高版本中导出无伪影的矢量图形?
从版本R2014b开始,MATLAB现在渲染图形很好地消除锯齿(最后!)
然而,这会导致显示我的一些数字的方式出现故障.如果我绘制一条线,使用hold on然后在不同颜色的完全相同的位置绘制另一条线,则该线以两种颜色的斑驳组合出现.在过去,该线条将简单地显示为在该位置绘制的最后一种颜色.
以下是蓝色迹线的示例,其中一些部分(较陡的位)显示绿线.在以前的MATLAB版本中,绿线将是连续的,但现在一些蓝线显示出来.

在新版本中是否有一种巧妙的解决方法,或者我必须确保在绘制到同一个地方之前删除任何现有的行?
我在散点图中找到了标记大小,并且图例在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新的图形引擎(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) 所以我需要在图中绘制一些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.这确实是可能的,但非常烦人,因为绘图不会有凸包,因此我需要迭代地逐个创建三角形.所以问题是:有更优雅的方式吗?
此外,如果有人的话,我愿意接受更好的可视化数据的建议.