Main Content

Optimizar el código para obtener y establecer propiedades de gráficas

Propiedades calculadas automáticamente

Determinadas propiedades tienen dependencias en el valor de otras propiedades. MATLAB® calcula automáticamente los valores de estas propiedades y actualiza sus valores basado en el modelo de gráficas actual. Por ejemplo, los límites del eje afectan a los valores utilizados para las marcas del eje, lo que, a su vez, afecta a las etiquetas de marcas del eje.

Cuando consulta una propiedad calculada, MATLAB realiza una drawnow implícita para garantizar que todos los valores de propiedades están al día antes de devolver el valor de la propiedad. La consulta provoca una actualización completa de todas las propiedades dependientes y una actualización de la pantalla.

MATLAB calcula los valores de determinadas propiedades basado en otros valores de los que depende esa propiedad. Por ejemplo, las funciones de representación crean automáticamente un eje con límites, etiquetas de marcas y un tamaño adecuado para los datos representados y el tamaño de la figura.

Las gráficas de MATLAB llevan a cabo una actualización completa, si es necesario, antes de devolver un valor desde una propiedad calculada para garantizar que el valor devuelto está al día.

En esta tabla se enumeran algunas de las propiedades calculadas más comunes.

ObjetoPropiedadesCuándo MATLAB calcula estas propiedades

Ejes

CameraPosition, CameraTarget, CameraUpVector, CameraViewAngle

Siempre

 

Position, OuterPosition, TightInset

Siempre

 

XLim, YLim, ZLim

Siempre

 

XTick, YTick, ZTick, XMinorTick, YMinorTick, ZMinorTick

Siempre

 

XTickLabel, YTickLabel, ZTickLabel, TickDir

Siempre

 

SortMethod

Siempre

Texto

Extent

Siempre

 

Position

Solo cuando el objeto de texto se usa como título de un eje o una etiqueta de eje

 

FontSize, FontWeight

Solo cuando el objeto de texto se usa como título de un eje o una etiqueta de eje

Ciclos ineficientes de set y get

Cuando establece los valores de una propiedad, cambia el estado del modelo de la gráfica y lo marca según sea necesarios para su actualización. Cuando consulta una propiedad autocalculada, MATLAB necesita realizar una actualización si el modelo y el hardware de la gráfica no están sincronizados.

Cuando obtiene y establece propiedades en el mismo bucle, puede crear una situación en la que las actualizaciones se realicen con cada paso por el bucle.

  • get provoca una actualización.

  • set marca el modelo de la gráfica según sea necesario para una actualización.

El ciclo se repite con casa paso por el bucle. Es preferible realizar todas las consultas de propiedades en un bucle y, después, ejecutar todos los conjuntos de propiedades en otro bucle, como se muestra en el siguiente ejemplo.

Este ejemplo obtiene y ejecuta la propiedad Extent del texto.

Código con un rendimiento deficienteCódigo con un mejor rendimiento
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Gets and sets in the same loop,
% prompting a full update at each pass
for ix = 1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
   set(h(ix),'Position',p(ix,:))
end
drawnow
h = gobjects(1,500);
p = zeros(500,3);
for ix = 1:500
   h(ix) = text(ix/500,ix/500,num2str(ix));
end
drawnow

% Get and save property values
for ix=1:500
   pos = get(h(ix),'Position');
   ext = get(h(ix),'Extent');
   p(ix,:) = [pos(1)+(ext(3)+ext(1)), ...
              pos(2)+ext(2)+ext(4),0];
end

% Set the property values and 
% call a drawnow after the loop
for ix=1:500
   set(h(ix),'Position',p(ix,:));
end
drawnow

Este código tiene un rendimiento deficiente ya que:

  • La propiedad Extent depende de otros valores, como la resolución de una pantalla, el tamaño de la figura y los límites de los ejes de forma que consultar esta propiedad puede provocar una actualización completa.

  • Cada conjunto de la propiedad Position marca una actualización completa necesaria cuando la siguiente obtención de la propiedad Extent tiene lugar.

El rendimiento es mejor porque este código:

  • cuestiona todos los valores de propiedad de un bucle y almacena dichos valores en un arreglo;

  • establece todos los valores de propiedad en un bucle independiente;

  • llama a drawnow después de que finalice el segundo bucle.

Cambiar el texto Extent para rotar etiquetas

En los casos en los que cambia la propiedad Extent del texto para rotar las etiquetas de los ejes, es más eficiente utilizar las propiedades de los ejes XTickLabelRotation, YTickLabelRotation y ZTickLabelRotation.