xlabel leyendas comando matlab grid plot cube

leyendas - subplot title matlab



Cómo trazar la cuadrícula 3D(cubo) en Matlab (6)

Considera esta solución vectorizada. Tiene la advantage que crea un solo objeto gráfico:

%# these don''t all have to be the same x = -8:2:8; y = -8:2:8; z = -8:2:8; [X1 Y1 Z1] = meshgrid(x([1 end]),y,z); X1 = permute(X1,[2 1 3]); Y1 = permute(Y1,[2 1 3]); Z1 = permute(Z1,[2 1 3]); X1(end+1,:,:) = NaN; Y1(end+1,:,:) = NaN; Z1(end+1,:,:) = NaN; [X2 Y2 Z2] = meshgrid(x,y([1 end]),z); X2(end+1,:,:) = NaN; Y2(end+1,:,:) = NaN; Z2(end+1,:,:) = NaN; [X3 Y3 Z3] = meshgrid(x,y,z([1 end])); X3 = permute(X3,[3 1 2]); Y3 = permute(Y3,[3 1 2]); Z3 = permute(Z3,[3 1 2]); X3(end+1,:,:) = NaN; Y3(end+1,:,:) = NaN; Z3(end+1,:,:) = NaN; %#figure(''Renderer'',''opengl'') h = line([X1(:);X2(:);X3(:)], [Y1(:);Y2(:);Y3(:)], [Z1(:);Z2(:);Z3(:)]); set(h, ''Color'',[0.5 0.5 1], ''LineWidth'',1, ''LineStyle'',''-'') %#set(gca, ''Box'',''on'', ''LineWidth'',2, ''XTick'',x, ''YTick'',y, ''ZTick'',z, ... %# ''XLim'',[x(1) x(end)], ''YLim'',[y(1) y(end)], ''ZLim'',[z(1) z(end)]) %#xlabel x, ylabel y, zlabel z axis off view(3), axis vis3d camproj perspective, rotate3d on

Hola, me gustaría trazar una cuadrícula transparente con forma de cubo con líneas en ella. Algo como esto:

Sin embargo, sólo logré dibujar una cuadrícula 2D:

[X,Y] = meshgrid(-8:.5:8); Z = X+1; surf(X,Y,Z)

Yo uso Matlab R2009b. Si es imposible trazar esto en matlab, ¿podría recomendarme un software que podría usar?


Entiendo que esta es una respuesta tardía, pero sigue siendo válida en caso de que alguien más esté pensando en hacer lo mismo.

Suponiendo que está trazando cubos (/ sus bordes), una alternativa a las respuestas ya proporcionadas es usar el código ''plotcube'' de Oliver: plotcube

La ventaja de esta solución es que puedes:

  1. Cambia la transparencia de las caras (FaceAlpha), y / o,
  2. Cambie la transparencia de los bordes (EdgeAlpha), y / o,
  3. Cambia el color de las líneas (EdgeColor).

Todas estas pueden ser constantes, o variables. (por ejemplo, color de borde fijo o un color que cambia con el valor Z, etc.)

Para agregar la funcionalidad de 2. y 3. (arriba) cambie la sección ''cellfun (@patch ...'' en el código de Olivers, agregando las cuatro líneas adicionales de código de la siguiente manera: (reemplace toda la sección de cellfun con esto, incluyendo las nuevas líneas ''EdgeAlpha'' y ''EdgeColor''):

cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},... repmat({clr},6,1),... repmat({''FaceAlpha''},6,1),... repmat({alpha},6,1),... repmat({''EdgeAlpha''},6,1),... repmat({0.2},6,1),... % Set this value to whatever you want; even a variable / matrix repmat({''EdgeColor''},6,1),... repmat({''black''},6,1)... );

Para obtener más información sobre el ''parche'', consulte patch documentación del patch .

Una nota importante: - para modelos grandes (muchos cubos) esto es muy lento de ejecutar. ej. ejecutando esta función ''plotcube'' en un bucle ''for'' en MATLAB a través de miles de bloques. Creo que esto es de llamar a la función ''parche'' varias veces. Una mejor solución sería vectorizar; para poner todos sus puntos (vértices / caras / lo que sea) juntos en una sola matriz primero y luego llamar a la función @patch solo una vez (sin bucle ''for''). Esto requeriría cambiar el código de alguna manera para actualizar todos los datos XYZ.

Espero que ayude a alguien.

Aquí está el código ''plotcube'' en caso de que el enlace al código original de Oliver se rompa algún día:

function plotcube(varargin) % PLOTCUBE - Display a 3D-cube in the current axes % % PLOTCUBE(EDGES,ORIGIN,ALPHA,COLOR) displays a 3D-cube in the current axes % with the following properties: % * EDGES : 3-elements vector that defines the length of cube edges % * ORIGIN: 3-elements vector that defines the start point of the cube % * ALPHA : scalar that defines the transparency of the cube faces (from 0 % to 1) % * COLOR : 3-elements vector that defines the faces color of the cube % % Example: % >> plotcube([5 5 5],[ 2 2 2],.8,[1 0 0]); % >> plotcube([5 5 5],[10 10 10],.8,[0 1 0]); % >> plotcube([5 5 5],[20 20 20],.8,[0 0 1]); % Default input arguments inArgs = { ... [10 56 100] , ... % Default edge sizes (x,y and z) [10 10 10] , ... % Default coordinates of the origin point of the cube .7 , ... % Default alpha value for the cube''s faces [1 0 0] ... % Default Color for the cube }; % Replace default input arguments by input values inArgs(1:nargin) = varargin; % Create all variables [edges,origin,alpha,clr] = deal(inArgs{:}); XYZ = { ... [0 0 0 0] [0 0 1 1] [0 1 1 0] ; ... [1 1 1 1] [0 0 1 1] [0 1 1 0] ; ... [0 1 1 0] [0 0 0 0] [0 0 1 1] ; ... [0 1 1 0] [1 1 1 1] [0 0 1 1] ; ... [0 1 1 0] [0 0 1 1] [0 0 0 0] ; ... [0 1 1 0] [0 0 1 1] [1 1 1 1] ... }; XYZ = mat2cell(... cellfun( @(x,y,z) x*y+z , ... XYZ , ... repmat(mat2cell(edges,1,[1 1 1]),6,1) , ... repmat(mat2cell(origin,1,[1 1 1]),6,1) , ... ''UniformOutput'',false), ... 6,[1 1 1]); cellfun(@patch,XYZ{1},XYZ{2},XYZ{3},... repmat({clr},6,1),... repmat({''FaceAlpha''},6,1),... repmat({alpha},6,1)... ); view(3);


Si no te importa unos cuantos bucles, algo como esto funcionará:

clf figure(1) for g = 0:.2:2 for i = 0:.2:2 plot3([g g], [0 2], [i, i]) hold on end end for g = 0:.2:2 for i = 0:.2:2 plot3([0 2], [g g], [i, i]) hold on end end for g = 0:.2:2 for i = 0:.2:2 plot3([i i], [g g], [0 2]) hold on end end

Solo tendrá que hacer que la cuadrícula sea transparente al cambiar las propiedades de la línea, no creo que pueda cambiar los valores alfa para lograr esto. Espero que sea de ayuda.


Una versión más vectorizada de la respuesta de Stephen podría ser la siguiente:

i = 0:0.2:2; [X Y] = meshgrid(i,i); x = [X(:) X(:)]''; y = [Y(:) Y(:)]''; z = [repmat(i(1),1,length(x)); repmat(i(end),1,length(x))]; col = ''b''; hold on; plot3(x,y,z,col); plot3(y,z,x,col); plot3(z,x,y,col);

Desafortunadamente, MATLAB no admite actualmente líneas transparentes (que yo sepa). Si realmente necesitas que sean transparentes, te sugiero usar ''parche''.


puede hacer que la línea interior sea transparente configurando color = [0.65, 0.65, 0.65]. Y puede usar el estilo de línea de guión para líneas interiores y líneas continuas para el límite para que sea más como un objeto en 3D.

En mi paquete de software, codifico una función mesh3 para trazar las mallas tridimensionales del producto tensorial.


clear all close all clc Nx=11; Ny=11; Nz=11; clf hold on [i,j]=meshgrid(1:Nx,1:Ny); k=zeros(Ny,Nx)+Nz; surf(i,j,k) [i,k]=meshgrid(1:Nx,1:Nz); j=zeros(Nz,Nx)+Ny; surf(i,j,k) [j,k]=meshgrid(1:Ny,1:Nz); i=zeros(Nz,Ny)+Nx; surf(i,j,k) [i,j]=meshgrid(1:Nx,1:Ny); k=zeros(Ny,Nx)+1; surf(i,j,k) [i,k]=meshgrid(1:Nx,1:Nz); j=zeros(Nz,Nx)+1; surf(i,j,k) [j,k]=meshgrid(1:Ny,1:Nz); i=zeros(Nz,Ny)+1; surf(i,j,k) view(30,30)