Перерисовать рисунок, сохраненный в 2013b, в 2014b

Поскольку MATLAB изменил свой движок фигур в R2014b, я решил перезапустить часть своего кода, чтобы получить из них более привлекательные фигуры. К сожалению, последнее, что у меня есть, — это код, который требует много времени для запуска, и я бы очень хотел избежать повторного запуска кода для более приятной фигуры.

Я сохранил результат в файле .fig в R2013b. Однако, если я открою его в R2014b, он все еще будет иметь старый формат.

Можно ли перерисовать фигуру с помощью графического движка MATLAB R2014b? Если это так, как я могу это сделать?

ПРИМЕЧАНИЕ: Фигура буквально открывается и рисуется новым движком, однако сохраняет свой старый формат. В то время как новая фигура с командой title() нарисует хороший большой жирный заголовок, если перерисовать эту фигуру с помощью «drawnow» или я сгенерирую для нее код, формат останется прежним.

Пример. Этот рисунок был создан в 2013 году и перерисован в 2014 году. Вы можете видеть, что заголовок не отображается в том же формате, что и 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')

Если этот код запустить в 2013b и 2014b, сохранить как fig в обоих, а затем открыть как fig в обоих, появятся следующие 2 рисунка:

введите здесь описание изображения введите здесь описание изображения

Фиговый файл 2013b: http://s000.tinyupload.com/index.php?file_id=02053933004513599550


person Ander Biguri    schedule 07.11.2014    source источник
comment
drawnow ничего не делает? Кроме того, это простой сюжет (вывод plot или scatter?). Если это так, вы можете довольно легко get вывести данные из рисунка. (Контуры или что-то в этом роде - не так просто).   -  person nkjt    schedule 07.11.2014
comment
@nkjt определенно не простой сюжет. Он имеет 12 подграфиков с разным объемом данных.   -  person Ander Biguri    schedule 07.11.2014
comment
Можете ли вы загрузить оригинальный .fig куда-нибудь?   -  person chappjc    schedule 08.11.2014
comment
@AnderBiguri: можешь попробовать использовать copyobj? Что-то вроде этого: stackoverflow.com/a/4010043/97160   -  person Amro    schedule 08.11.2014
comment
хорошо, я удаляю свои комментарии. Извините за захват ветки   -  person Amro    schedule 08.11.2014
comment
@Amro Как бы я использовал copyoct в этом случае? Рисунок сохраняется в папке, это не переменная в рабочей области.   -  person Ander Biguri    schedule 10.11.2014
comment
@AnderBiguri: Моя идея заключалась в том, чтобы сначала hgload сделать фигуру, а затем использовать copyobj для создания из нее новой копии в надежде, что она будет отрисована с помощью новой графической системы... В любом случае, я только что попытался воспроизвести проблему на своем конец, и я не мог; Я использовал простой график, сохраненный в R2014a, а затем загрузил его в файл FIG в R2014b, и он был отрендерен с новой графикой (сглаженные линии, новые цвета и все такое)... Можете ли вы поделиться исходным файлом FIG, который вызывает проблема, или хотя бы создать более простой, который демонстрирует проблему?   -  person Amro    schedule 11.11.2014
comment
@Amro На самом деле сглаженные линии и это происходит, но размер шрифта, цвета по умолчанию и так далее. Попробуйте сохранить 2 подграфика с 3 строками данных вместе. В любом случае, наверное, я просто вручную изменю настройки (цвета, шрифты, ...) рисунка.   -  person Ander Biguri    schedule 11.11.2014
comment
Что, если вы загрузите фигуру и используете File -> Generate Code.... Это даст вам m-файл, который воспроизводит сюжет, включая цвета и шрифты, использованные при его сохранении. Затем вы можете удалить строки, относящиеся к размерам и цветам шрифта, и запустить m-файл. Не могу проверить это сам, потому что у меня нет под рукой старой копии MATLAB.   -  person transversality condition    schedule 08.08.2015
comment
@transversalitycondition нет, пробовал (см. сообщение). Код генерации не установил некоторые вещи. Я думаю, что для этого нет реальных решений, просто цифры не на 100% совместимы друг с другом.   -  person Ander Biguri    schedule 09.08.2015
comment
Вы там смотрели? mathworks.com/matlabcentral/ ответы/   -  person BillBokeey    schedule 19.10.2015
comment
@BillBokeey, но это не сработает в случае, когда есть заголовки, аннотации, 5 типов данных, стрелки, xtick и ytick и т. д., верно? Это будет работать, если вручную ввести все, что нужно извлечь, но это очень утомительно.   -  person Ander Biguri    schedule 19.10.2015
comment
Возможно, вы могли бы перебирать дочерние элементы основных осей (т.е. 12 подосей, если у вас есть 12 подграфиков), и для каждого дочернего цикла снова перебирать дочерние элементы, чтобы обнаруживать данные, определяя тип элементов, которые вы получаете   -  person BillBokeey    schedule 19.10.2015
comment
Не могли бы вы поделиться своим файлом .fig? мне было бы весело попробовать это сделать   -  person BillBokeey    schedule 19.10.2015
comment
Там тоже кое-что нашел (о структуре простых инжиров): формат файлов   -  person BillBokeey    schedule 19.10.2015
comment
А вот о получении данных из подзаголовка: mathworks.com/matlabcentral/newsreader/view_thread/290029   -  person BillBokeey    schedule 19.10.2015
comment
@BillBokeey проверьте обновление.   -  person Ander Biguri    schedule 19.10.2015
comment
Ну, я понятия не имею, смогу ли я это сделать или нет, но я определенно получу удовольствие, пытаясь! (Может, завести чат на эту тему, чтобы поделиться прогрессом?)   -  person BillBokeey    schedule 19.10.2015
comment
У вас также есть настраиваемые метки и отметки?   -  person BillBokeey    schedule 19.10.2015
comment
@BillBokeey, да. Идея в целом такова: что бы вы ни настроили, это должно получиться как есть, но если что-то осталось по умолчанию, то это должно быть нарисовано с новым значением по умолчанию. Более менее.   -  person Ander Biguri    schedule 19.10.2015
comment
Ну, я не мог закончить это сегодня, но у меня есть хорошее чувство, что все можно сделать динамически   -  person BillBokeey    schedule 19.10.2015


Ответы (1)


Для этого есть обходной способ — просто использовать hgopen для загрузки рисунка, а затем извлечь данные для повторного построения графика в 2014b:

h1=hgopen('test.fig');              % h1 = handle to the figure
allaxes=get(h1,'children');         % allaxes = array with axes handles 
for a=1:length(allaxes)
    ax=allaxes(a);
    allines=get(ax,'children');     % all lines in current axes
    for l=1:length(allines)
        lin=allines(l);
        values=get(lin,'ydata');    % values of the current line
        subplots{a}{l}=values;
    end
end

Затем вы можете использовать массив ячеек subplots, чтобы снова построить графики вручную. Это скучный способ сделать это, но, возможно, стоит попробовать, если повторная генерация вывода занимает очень много времени.

person alle_meije    schedule 20.10.2015