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.
Objeto | Propiedades | Cuándo MATLAB calcula estas propiedades |
---|---|---|
Ejes |
| Siempre |
| Siempre | |
| Siempre | |
| Siempre | |
| Siempre | |
| Siempre | |
Texto |
| Siempre |
| Solo cuando el objeto de texto se usa como título de un eje o una etiqueta de eje | |
| 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 deficiente | Có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:
| El rendimiento es mejor porque este código:
|
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
.