same - plot figure matlab
Concatenating 2D-plot-MATLAB (2)
Veo dos opciones aquí: 1. Concatenar a la misma trama y pad con NaNs para obtener el espacio. 2. en realidad tiene varias parcelas y usa axes
de una manera inteligente.
Aquí hay un ejemplo para la opción 1: Primero crearemos algunos datos falsos:
a1=rand(1,20);
b1=3+rand(1,20);
c1=6+rand(1,20);
a2=rand(1,20);
b2=3+rand(1,20);
c2=6+rand(1,20);
a3=rand(1,20);
b3=3+rand(1,20);
c3=6+rand(1,20);
Esto es solo para relleno con NaNs ...
f=@(x) [ NaN(1,round(numel(x)/5)) x ];
Concatenación:
y1=[f(a1) f(a2) f(a3)];
y2=[f(b1) f(b2) f(b3)];
y3=[f(c1) f(c2) f(c3)];
trazado
x=1:numel(y1);
plot(x,y1,x,y2,x,y3);
set(gca,''XTickLabel'',[]);
Tengo varios gráficos 2D en MATLAB. En cada trama hay algunas líneas (cada línea es un vector de fila de valores de longitud fija). Siempre hay una línea de base (negra) y las líneas de color restantes pueden o no estar presentes. .
Necesito concatenar todas esas tramas en una parcela como se muestra a continuación: . Por favor, no son solo para fines de representación, pero explican bien mi problema. No puedo descifrar cómo hacerlo. Alguien tiene una idea? Un ejemplo puede ser? Además, debe haber un espacio vertical entre los trazados sucesivamente concatenados como se muestra en la última figura. Algunos puntos a tener en cuenta:
- el eje y es de longitud fija para todas las parcelas
- si el eje x de cada trama individual es 1: m. Entonces el eje x de la gráfica final concatenada es 1: (n * m), donde n es el número de trazados individuales a concatenar.
Además, dado que cada línea de color corresponde a un tipo específico de datos, ¿cómo crear su leyenda? ¡Gracias!
Esto es con respecto a la parte de la legend
de su pregunta:
Para tener una sola entrada de leyenda para varios elementos graficados por separado (el término más preciso sería "hijos del objeto de los ejes"), debe usar hggroup
. De esta forma, los objetos trazados (como líneas) se agrupan (técnicamente se convierten en hijos del hggroup
lugar de ser hijos de los axes
directamente) lo que le permite aplicar ciertas configuraciones a todo el grupo simultáneamente.
Aquí hay un ejemplo simple de cómo funciona esto:
%// Without hggroup
figure(1337); hold all;
x = linspace(-pi/2,pi/2,200);
for ind=1:3
plot(x,sin(ind*x+ind),''DisplayName'',...
[''sin('' num2str(ind) ''x+'' num2str(ind) '')'']);
end
legend(''-DynamicLegend'',''Location'',''NorthWest'');
Resultados en:
Mientras:
%// With hggroup
figure(1338); hold all;
x = linspace(-pi/2,pi/2,200);
prePlot=length(get(gca,''Children''));
for ind=1:3
plot(x,sin(ind*x+ind),''DisplayName'',...
[''sin('' num2str(ind) ''x+'' num2str(ind) '')'']);
end
postPlot=length(get(gca,''Children''));
meshGrp = LegendGroupLatest(gca,postPlot-prePlot);
set(meshGrp,''DisplayName'',''Some sines'');
legend(''-DynamicLegend'',''Location'',''NorthWest'');
Donde LegendGroupLatest
es:
function grpName=LegendGroupLatest(ax_handle,howMany)
grpName=hggroup;
tmp=get(ax_handle,''Children''); set(tmp(2:howMany+1),''Parent'',grpName);
set(get(get(grpName,''Annotation''),...
''LegendInformation''),''IconDisplayStyle'',''on'');
Resultados en:
En este ejemplo, todas las líneas que se trazaron dentro del bucle se agregan a un solo hggroup
sin afectar los elementos dibujados anteriormente, y obviamente puede agregar lógica diferente para asignar gráficas a grupos.
Tenga en cuenta que una leyenda dinámica generalmente agrega cualquier line
que esté presente en el gráfico (si dibuja un cuadro de zoom en un eje que tiene una leyenda dinámica, los bordes del cuadro de zoom se agregan temporalmente a la leyenda), pero hggroup
impide.