Построение нескольких графиков
В этом примере показано, как построить графики в тех же осях с помощью hold функция, и как создать несколько осей на рисунке, использующем tiledlayout функция.
Построение нескольких графиков на тех же осях координат
По умолчанию новые графики очищают существующие графики и сбрасывают свойства осей, такие как заголовок. Однако можно использовать hold on команда, чтобы построить несколько графиков в тех же осях. Например, постройте два графика и график рассеивания. После отключите удержание командой hold off.
x = linspace(0,10,50); y1 = sin(x); plot(x,y1) title('Combine Plots') hold on y2 = sin(x/2); plot(x,y2) y3 = 2*sin(x); scatter(x,y3) hold off
Когда состояние удержания включено, новые графики не очищают существующие графики или сбрасывают свойства осей, такие как заголовок или подписи по осям. Цикл графиков через цвета и стили линии на основе ColorOrder и LineStyleOrder свойства осей. Пределы осей и значения деления могут настроить, чтобы хранить новые данные.
Отобразите несколько осей в фигуре
Можно отобразить несколько осей на одной фигуре при помощи tiledlayout функция. Эта функция создает мозаичное размещение графика, содержащее невидимую сетку мозаик по целой фигуре. Каждая мозаика может содержать оси для отображения графика. После создания размещения вызовите nexttile функционируйте, чтобы поместить объект осей в размещение. Затем вызовите функцию построения графика, чтобы построить в оси. Например, создайте два графика в 2 1 размещение. Добавьте заголовок на каждый график.
x = linspace(0,10,50); y1 = sin(x); y2 = rand(50,1); tiledlayout(2,1) % Top plot nexttile plot(x,y1) title('Plot 1') % Bottom plot nexttile scatter(x,y2) title('Plot 2')

Создайте график, охватывающий несколько строк или столбцов
Чтобы создать график, который охватывает несколько строк или столбцов, задайте span аргумент, когда вы вызываете nexttile . Например, создайте размещение 2 на 2. Постройте в первые две мозаики. Затем создайте график, который охватывает одну строку и два столбца.
x = linspace(0,10,50); y1 = sin(x); y2 = rand(50,1); % Top two plots tiledlayout(2,2) nexttile plot(x,y1) nexttile scatter(x,y2) % Plot that spans nexttile([1 2]) y2 = rand(50,1); plot(x,y2)

Измените Внешний вид осей
Измените внешний вид осей путем установки свойств на каждом из объектов осей. Можно получить объект осей путем вызова nexttile функция с выходным аргументом. Также можно задать объект осей как первый входной параметр к графической функции, чтобы гарантировать, что функция предназначается для правильных осей.
Например, создайте два графика и присвойте объекты осей переменным ax1 и ax2 . Измените размер шрифта осей и цвет оси X для первого графика. Добавьте линии сетки во второй график.
x = linspace(0,10,50); y1 = sin(x); y2 = rand(50,1); tiledlayout(2,1) % Top plot ax1 = nexttile; plot(ax1,x,y1) title(ax1,'Plot 1') ax1.FontSize = 14; ax1.XColor = 'red'; % Bottom plot ax2 = nexttile; scatter(ax2,x,y2) title(ax2,'Plot 2') grid(ax2,'on')

Управляйте интервалом вокруг мозаик
Можно управлять интервалом вокруг мозаик в размещении путем определения Padding и TileSpacing свойства. Например, отобразите четыре графика в размещении 2 на 2.
x = linspace(0,30); y1 = sin(x); y2 = sin(x/2); y3 = sin(x/3); y4 = sin(x/4); % Create plots t = tiledlayout(2,2); nexttile plot(x,y1) nexttile plot(x,y2) nexttile plot(x,y3) nexttile plot(x,y4)

Уменьшайте интервал вокруг периметра размещения и вокруг каждой мозаики путем установки Padding и TileSpacing свойства к ‘compact’ .
t.Padding = 'compact'; t.TileSpacing = 'compact';

Отобразите разделяемый заголовок и подписи по осям
Можно отобразить разделяемый заголовок и совместно использованные подписи по осям в размещении. Создайте 2 1 размещение t . Затем отобразите линейный график и диаграмму стебель-листья. Синхронизируйте пределы оси X путем вызова linkaxes функция.
x1 = linspace(0,20,100); y1 = sin(x1); x2 = 3:17; y2 = rand(1,15); % Create plots. t = tiledlayout(2,1); ax1 = nexttile; plot(ax1,x1,y1) ax2 = nexttile; stem(ax2,x2,y2) % Link the axes linkaxes([ax1,ax2],'x');

Добавьте разделяемый заголовок и совместно использованные подписи по осям путем передачи t к title xlabel , и ylabel функции. Подвиньте графики поближе вместе путем удаления меток в виде галочки оси X из главного графика и установки TileSpacing свойство t к ‘compact’ .
% Add shared title and axis labels title(t,'My Title') xlabel(t,'x-values') ylabel(t,'y-values') % Move plots closer together xticklabels(ax1,<>) t.TileSpacing = 'compact';
Документация
Можно построить графики несколькими способами. Постройте графики в тех же осях или создайте несколько осей в фигуре, использующей подграфики.
Построение нескольких графиков на тех же осях координат
По умолчанию новые графики очищают существующие графики и сбрасывают свойства осей, такие как заголовок. Однако можно использовать команду hold on , чтобы построить несколько графиков в тех же осях. Например, постройте два графика и график рассеивания. После отключите удержание командой hold off.
x = linspace(0,10,50); y1 = sin(x); plot(x,y1) title('Combine Plots') hold on y2 = sin(x/2); plot(x,y2) y3 = 2*sin(x); scatter(x,y3) hold off

Когда состояние удержания включено, новые графики не очищают существующие графики или сбрасывают свойства осей, такие как заголовок или подписи по осям. Цикл графиков через цвета и линии разрабатывает на основе свойств ColorOrder и LineStyleOrder осей. Пределы осей и значения деления могут настроить, чтобы хранить новые данные.
Создание нескольких осей в фигуре Используя подграфики
Создайте несколько осей на одной фигуре с помощью функции subplot , которая делит фигуру на сетку подграфиков. Первые два входных параметров к subplot указывают на количество подграфиков в каждой строке и столбце. Третий вход задает, какой подграфик активен. Положения подграфика цифр MATLAB строкой. Графические функции, такие как plot и title , предназначаются для активного подграфика.
Например, создайте два сложенных подграфика в 2 1 сетка в рамках окна рисунка. Добавьте заголовок на каждый подграфик.
subplot(2,1,1); x = linspace(0,10,50); y1 = sin(x); plot(x,y1) title('Subplot 1') subplot(2,1,2); y2 = rand(50,1); scatter(x,y2) title('Subplot 2')

Создайте Подграфик который Промежутки Несколько Положений Сетки
Чтобы создать подграфик, который охватывает несколько положений сетки, задайте третий входной параметр к функции subplot как массив положений. Например, создайте сетку 2 на 2 подграфиков. Создайте два подграфика в верхней части фигуры и один подграфик, который охватывает целую нижнюю половину.
figure subplot(2,2,1); x = linspace(0,10,50); y1 = sin(x); plot(x,y1) subplot(2,2,2); y2 = rand(50,1); scatter(x,y2) subplot(2,2,[3 4]); y3 = rand(50,1); plot(x,y2)

Измените внешний вид подграфика
Измените внешний вид подграфика путем установки свойств базового объекта Axes . Доступ к объекту Axes с помощью выходного аргумента от функции subplot . Также можно использовать объекты Axes в качестве первого входного параметра к графическим функциям, чтобы гарантировать, что функция предназначается для правильного подграфика.
Например, создайте два подграфика и присвойте объекты Axes переменным ax1 и ax2 . Измените размер шрифта осей и цвет оси X для первого подграфика. Добавьте линии сетки во второй подграфик.
figure ax1 = subplot(2,1,1); x = linspace(0,10,50); y1 = sin(x); plot(ax1,x,y1) title(ax1,'Subplot 1') ax1.FontSize = 14; ax1.XColor = 'red'; ax2 = subplot(2,1,2); y2 = rand(50,1); scatter(ax2,x,y2) title(ax2,'Subplot 2') grid(ax2,'on')

Добавьте супер заголовок на сетку подграфиков
Когда вы создаете фигуру с подграфиками, вы можете хотеть добавить заголовок, который применяется ко всем подграфикам. Начиная в R2018b, можно использовать функцию sgtitle , чтобы добавить заголовок на сетку подграфиков.
subplot(2,1,1); x = linspace(0,10,50); y1 = sin(x); plot(x,y1) title('Subplot 1') subplot(2,1,2); y2 = rand(50,1); scatter(x,y2) title('Subplot 2') sgtitle('My Subplot Grid Title')
Как построить 2 графика на одном рисунке?
у меня код есть могу построить первый график сначала а потом заменить данные и построить второй график но отдельно хочу построить их вместе на одном рисунке как построить второй в конце есть Коментарии (у умножение строка 26 и 62 на 2 и изменение в 10 )
Вложения
| matlab_rabochiy.rar (725 байт, 60 просмотров) |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Не строится два графика на одном рисунке
figure(‘name’,’log) loglog(f,Spectrum_Power, ‘b’); hold all; y53=(-5/3)*f;.
Как построить 2 трехмерных графика в одном окне
Графики строятся по отдельности, но хочу для сравнения вывести их в одном окне. Подскажите, что не.

2 графика на одном рисунке с 2 осями х и одной осью y
Здравствуйте. Есть 2 зависимости иксы разные, а игрики одинаковые: х1: 1, 5, 3, 2, 5, 6, 7 .

Построить на одном рисунке графики двух функций
построить на одном рисунке графики двух функций F(x), G(x), задав изменение x на отрезке с шагом.
Регистрация: 15.05.2013
Сообщений: 73
Используй команду subplot. Она строит отдельные графики в одном окне.
Если надо построить 2 графика на одном рисунке, то используй hold on, только выходные функции должны иметь разные имена, т.е. типа y1 и y2.
Регистрация: 17.04.2013
Сообщений: 49
код сложный subplot и hold on не подходят
Регистрация: 04.05.2013
Сообщений: 13
Каким образом сложность кода влияет на работу функций hold on и subplot.
Регистрация: 17.04.2013
Сообщений: 49
посмотрите пожалуйста код и напишите мне как можно там использовать hold on или subplot
заранее спасибо Вам
Регистрация: 15.05.2013
Сообщений: 73
Сообщение от Puxoper 
Каким образом сложность кода влияет на работу функций hold on и subplot.
Не понял вопроса. Для постройки разных графиков нужны разные функции. Переменные могут быть одинаковые.
Твой код реально сложный, но тебе советую выделить результирующие функции отдельно.
Покажу на простом примере:
1 2 3 4 5 6 7
x = 0:0.5:10; y1 = cos(x) - 2; y2 = sin(x); plot(x,y1,'b'); hold on; plot(x,y2,'r'); hold off;
1 2 3 4 5
x = 0:0.5:10; y1 = cos(x) - 2; y2 = sin(x); subplot(1,2,1); plot(x,y1,'b'); subplot(1,2,2); plot(x,y2,'r');
Регистрация: 17.04.2013
Сообщений: 49
ДА так понятно
но, у меня не так каждый график отдельно строится но на одном рисунке не знаю как
думаю что найду ответ у вас — второй график отличается от первого только в строку 26 и 62 надо умножить на 2
и построить вместе
кто может этого делать напишите пожалуйста очень важно
461 / 451 / 56
Регистрация: 28.05.2013
Сообщений: 699
А так сойдёт?:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
S=50; Talone=[1.5 2 2 2 2 2 2 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 3 3 3 3 3 3 3 3 3 3 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5 3.5 4 4 4 4 4 4 4.5 4.5 4.5 4.5 5 5 5.5 5.5 6]; Talone=Talone*1000; Tmin_fix=0.9*1000; Tmin_min=0.6*1000; Tmin_max=1.2*1000; shagTmin=0.1*1000; kolShagT=(Tmin_max-Tmin_min)/shagTmin+1; C=((1/S)*sum(1./Talone))^(-1); A=1500; Ro=A/(2*C); maxM=10; minM=4; mFix=5; m_plot=zeros(1,(maxM-minM)+1); p_plot=zeros(1,(maxM-minM)+1); for countM=1 : 1 : (maxM-minM)+1; m=countM+minM-1; m_plot(countM)=m; t=Talone./m; Pr1=(Ro^m)*(1-Ro); Em=Ro/(1-Ro); Pr2=(m*Pr1)/Em; T=((1-Ro)/S)*sum(Talone); Tmin=Tmin_fix; k=(Talone)./Tmin; k1=floor(k); a=zeros(1,length(k1)); a1=zeros(1,length(k1)); for j = 1 : 1: S; if k1(j)>=m a(j)=(m*(Ro)^(m-1))*(1-Ro)^2; else continue; end; if j>1 if k1(j)~=k1(j-1) a1(j)=sum(a); else a1(j)=a1(j-1); end; else a1(1)=a(1); end; end; Pr1Tmin=sum(a1)/S; p_plot(countM)=Pr1Tmin; end; plot(m_plot,p_plot,'-r','LineWidth',2); hold on % pause; t_plot=zeros(1,kolShagT); p_plot=zeros(1,kolShagT); for countT=1 : 1 : kolShagT; m=mFix; t=Talone./m; Pr1=(Ro^m)*(1-Ro); Em=Ro/(1-Ro); Pr2=(m*Pr1)/Em; T=((1-Ro)/S)*sum(Talone); Tmin=Tmin_min+(countT-1)*shagTmin; t_plot(countT)=Tmin; k=(Talone)./Tmin; k1=floor(k); a=zeros(1,length(k1)); a1=zeros(1,length(k1)); for j = 1 : 1: S; if k1(j)>=m a(j)=(m*(Ro)^(m-1))*(1-Ro)^2; else continue; end; if j>1 if k1(j)~=k1(j-1) a1(j)=sum(a); else a1(j)=a1(j-1); end; else a1(1)=a(1); end; end; Pr1Tmin=sum(a1)/S; p_plot(countT)=Pr1Tmin; end; plot(t_plot,p_plot,'LineWidth',2); % случай с двойной несущей домножаю Talone на 2 в сторке 26 и 62 % уменьшаю спорс на трафик А в два раза(строка) 10
Построение графиков с двумя независимыми осями в Matlab
Статья будет полезна тем, кто оформляет графики в среде Matlab.
При подготовке графиков для публикации статей в научных журналах и различного рода отчетов, я довольно часто сталкивался с необходимостью построения нескольких кривых, относящихся каждая к своей оси — чтобы не перегружать статью графиками и не выходить за их лимит. Но для этого в Matlab до версии R2014a была лишь команда plotyy(X1,Y1,X2,Y2), которая имеет ряд неприятных особенностей, из-за которых приходилось пользоваться другими программами и делать все вручную, что во-первых, усложняет этот процесс с точки зрения единой стилистики, во-вторых требует большого количества времени, а в-третьих не позволяет оперативно вносить изменения.
Неприятные особенности и описание
К таким неприятным особенностям я бы отнес:
1. Отсутствие аналога hold on («родной» hold on работает не совсем корректно с plotyy). Для того, чтобы добавить более, чем 2 кривые необходимо использовать вот такую конструкцию:
[hAx,hLine1,hLine2] = plotyy([x1',x2'],[y1' y2'],[x3',x4'],[y3',y4']); %Добавляет 4 кривые
Из этой конструкции вытекает неприятная особенность №2:
2. Размерности массивов, заключенных в квадратные скобки должны совпадать, т.к. из них формируются матрицы элементов. На практике такое бывает очень не часто.
3. Оформление серьезно страдает оттого, что нельзя программными методами изменить цвета и типы всех линий подряд, можно форматировать только набор линий, относящихся к конкретной оси (hLine1 и hLine2) — во всяком случае, я не смог. При этом, я не говорю сейчас об изменении параметров руками, т.е. редактированием в окне «figure» — только непосредственно кодом в .m-файле.
Резюмируя вышесказанное: plotyy() не очень хорошо подходит для отображения нескольких наборов графиков для разных осей. Разве что для простеньких зависимостей типа этих:
x = linspace(0,10); y1 = 200*exp(-0.05*x).*sin(x); y2 = 0.8*exp(-0.5*x).*cos(10*x); y3 = 0.2*exp(-0.5*x).*cos(10*x); y4 = 150*exp(-0.05*x).*sin(x); X=[x',x']; Y1=[y1' y4']; Y2=[y2',y3']; [hAx,hLine1,hLine2] = plotyy(X,Y1,X,Y2);
То ли дело команда yyaxes, появившаяся в версии Matlab R2014a. Вот тут уж нам стало где развернуться.
Рассказать о прелестях данной команды я бы хотел на своем примере. Задача состоит в том, что мне необходимо построить на одном графике 3 профиля температур (решения, полученные прямым численным методом, моментным методом и экспериментальные значения), относящихся к правой оси, и 3 профиля давлений, относящихся к левой оси. А также добавить стрелки и подписи.
Команды yyaxis left и yyaxis right позволяют справиться с этой задачей на раз. В чем, собственно, суть. В рамках одной figure мы можем построить любое количество графиков, привязав их к одной из осей. В рамках каждой из команд прекрасно работает все то же самое, что и для обычных графиков.
Структура рисунка в таком случае будет выглядеть так:
figure() yyaxis left yyaxis right
Наполнив эту структуру необходимым, получаем в результате:

Код программы
% График во весь экран h = figure('Units', 'normalized', 'OuterPosition', [0 0 1 1]); % Настройки шрифта: F='Times New Roman'; FN='FontName'; FS='FontSize'; l=30;% Размер шрифта set(gca, FN, F, FS, l) box on % Рамка hold on %% ПРАВАЯ ОСЬ yyaxis right hPlot_1 = plot(time*10^6, T); % Прямой численный метод hPlot_2 =plot(time_exp_T*10^6, T_exp); % Экспериментальное значение hPlot_3 =plot(time_pk, T_pk); % Моментный метод set( hPlot_1, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' ); set( hPlot_2, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'o' ); set( hPlot_3, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' ); % Пределы по у (справа) ylim([180 270]); % Подписи осей по у (справа) yticks([190 200 210 220 230 240 250 260 267]) yticklabels() % Цвет осей set(gca,'xcolor','k'); set(gca,'ycolor','k'); %% ЛЕВАЯ ОСЬ yyaxis left hPlot_10 = plot(time_P*10^6, P_p0); % Прямой численный метод hPlot_11 = plot(time_exp_P_p0*10^6, P_p0_exp); % Экспериментальное значение hPlot_13 = plot(time_pk, Pp0_pk); % Моментный метод set( hPlot_10, 'LineWidth', 3, 'LineStyle', ':', 'Color', 'k' ); set( hPlot_11, 'LineWidth', 1, 'LineStyle', 'none', 'Color', 'k', 'Marker', 'x' ); set( hPlot_13, 'LineWidth', 3, 'LineStyle', '--', 'Color', 'k' ); % Пределы по у (слева) ylim([0.1 0.8]); % Подписи осей по у (слева) yticks([0.2 0.3 0.4 0.5 0.6 0.7 0.77]) yticklabels() % Цвет осей set(gca,'xcolor','k'); set(gca,'ycolor','k'); %% ОФОРМЛЕНИЕ ГРАФИКОВ % Маркеры и подписи оси Х xticks([0 20 40 60 80 100 120 140 160 185]) xticklabels() % СТРЕЛКИ text(20,0.3,'\leftarrow', FS, 60, FN, F); text(140,0.6,'\rightarrow', FS, 60, FN, F); text(160,0.24,'1', FS, l, FN, F); text(60, 0.25,'2', FS, l, FN, F); text(120, 0.2,'3', FS, l, FN, F); text(140,0.51,'4', FS, l, FN, F); text(80, 0.52,'5', FS, l, FN, F); text(120,0.48,'6', FS, l, FN, F); text(5,0.75,'\it D_2O - N_2', FS, l, FN, F); hold off
Еще одна дополнительная фишка в подготовке графиков к печати — это их простое и удобное сохранение в любом, поддерживаемом Matlab-ом, формате. Для этого необходимо лишь добавить следующие строки:
%% СОХРАНЕНИЕ РЕЗУЛЬТАТОВ file_name = strcat('T, p_p0 - mm, ch, exp'); % Имя файла saveas(h, file_name, 'bmp'); % Формат .bmp saveas(h, file_name, 'fig'); % Формат .fig saveas(h, file_name, 'eps'); % Формат .eps saveas(h, file_name, 'jpeg'); % Формат .jpeg close(h); % Закрыть график после сохранения
Начиная с версии R2014a Matlab стал подходящей программой для подготовки графиков к публикации статей в различных научных журналах. Важным плюсом является очень хорошая гибкость этого инструмента, позволяющая обрабатывать результаты и представлять их в удобоваримом и красивом виде, в том числе и для т.н. «пакетной» обработки.
Сюда стоит заглянуть:
- matlab
- графики и диаграммы
