Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Visión general del desarrollo de gráficas

Las funciones de representación gráfica, como plot, scatter y bar, le permiten visualizar rápidamente sus datos con controles básicos sobre los aspectos como el color o el estilo de línea. Para crear visualizaciones personalizadas, puede combinar varios objetos de gráficos, configurar las propiedades de dichos objetos o llamar a funciones adicionales. En la R2019a y en versiones anteriores, una forma habitual de almacenar el código de personalización y compartirlo con los demás es escribir un script o una función.

A partir de la versión R2019b, puede crear una implementación de clases para las gráficas definiendo una subclase de la clase básica ChartContainer. Crear una clase le permite:

  • Ofrecer una interfaz práctica para sus usuarios: cuando estos deseen personalizar un aspecto de su gráfica, pueden establecer una propiedad en lugar de tener que modificar y volver a ejecutar el código de su gráfica. Ellos pueden modificar las propiedades en la línea de comandos o inspeccionarlas en el Inspector de propiedades.

  • Encapsular los objetos de gráficos primitivos y los algoritmos: puede implementar métodos que calculen y gestionen los objetos de gráficos subyacentes. Organizar su código de esta manera le permite ocultar los detalles de implementación de sus usuarios.

La clase básica ChartContainer es compatible con gráficas que tienen un único conjunto de ejes cartesianos. Cuando define una gráfica que deriva de esta clase básica, las instancias de su gráfica son miembros de la jerarquía de objetos de gráficos. Como resultado, sus gráficas son compatibles con muchos aspectos del sistema de gráficos. Por ejemplo, las funciones gca y findobj pueden devolver instancias de la gráfica.

Estructura de una clase de gráficas

La primera línea de una clase de gráficas especifica la clase matlab.graphics.chartcontainer.ChartContainer como la superclase. Por ejemplo, la primera línea de una clase llamada ConfidenceChart tiene este aspecto:

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

Además de especificar la superclase, incluya los siguientes componentes en su definición de clase.

ComponenteDescripción

Bloque de propiedades públicas
(recomendado)

Este bloque define todas las propiedades a las que quiere que sus usuarios tengan acceso. De manera conjunta, estas propiedades componen la interfaz de usuario de su gráfica.

Bloque de propiedades privadas
(recomendado)

Este bloque almacena los objetos de gráficos subyacentes y otros detalles de implementación a los que no quiere que tengan acceso sus usuarios.

Configure estos valores de atributo en este bloque:

  • Access = private

  • Transient

  • NonCopyable

Método setup
(obligatorio)

Este método establece el estado inicial de la gráfica. Se ejecuta una vez que MATLAB® construye el objeto tras configurar los valores de propiedad especificados por el usuario.

Defina este método en un bloque protegido, de forma que solo pueda ejecutarlo su clase.

Método update
(obligatorio)

Este método actualiza los objetos subyacentes en su gráfica. Se ejecuta con las siguientes condiciones:

  • Durante la próxima ejecución de drawnow, después de que el usuario cambie uno o más valores de propiedad.

  • Cuando cambia un aspecto del entorno de las gráficas del usuario (como el tamaño de las figuras).

Defina este método en el mismo bloque protegido que el método setup.

Método constructor implícito

No tiene que escribir un método constructor para su clase porque se hereda un constructor de la clase básica ChartContainer. El constructor acepta argumentos de entrada opcionales: un contenedor principal y cualquier número de argumentos de par nombre-valor para la configuración de las propiedades en la gráfica. Por ejemplo, si define una clase llamada ConfidenceChart que tenga las propiedades públicas XData e YData, puede crear una instancia de su clase mediante uno de los siguientes comandos:

c = ConfidenceChart(gcf,'XData',[1 2 3],'YData',[4 5 6])
c = ConfidenceChart('XData',[1 2 3],'YData',[4 5 6])

Si desea facilitar una interfaz que acepte argumentos de entrada de la misma forma que lo hace una función normal, puede definir un método constructor personalizado. Para obtener más información, consulte Escribir constructores para clases de gráficas.

Bloques de propiedades privadas y públicas

Divida sus propiedades de clase entre al menos dos bloques:

  • Un bloque público para almacenar los componentes de la interfaz visibles a los usuarios.

  • Un bloque privado para almacenar los detalles de la implementación que desea ocultar.

Las propiedades que se incluyen en el bloque público almacenan los valores de entrada provistos por el usuario. Por ejemplo, una gráfica que muestra una línea puede almacenar los vectores de las coordenadas x e y en dos propiedades públicas. Dado que los argumentos de par nombre-valor de propiedad son entradas opcionales para el método constructor implícito, el planteamiento recomendado es inicializar las propiedades públicas en los valores predeterminados. Si define las propiedades públicas que almacenan los valores de las coordenadas, inicializarlas en valores NaN o arreglos vacíos da lugar a gráficas vacías si el usuario llama al constructor sin entradas.

Las propiedades que se incluyen en el bloque privado almacenan los objetos de gráficos subyacentes que componen la gráfica, además de cualquier valor calculado que desee guardar. Finalmente, su clase utilizará los datos en las propiedades públicas para configurar los objetos subyacentes. Al incluir los atributos Transient y NonCopyable en el bloque privado, evita almacenar información redundante si el usuario copia o guarda una instancia de la gráfica.

Por ejemplo, aquí están los bloques de propiedades de una gráfica que muestra un objeto Line y un objeto Patch. El bloque de propiedades públicas almacena los valores que el usuario puede controlar: las coordenadas x e y de la línea, un valor de margen de confianza, un símbolo de marcador y un valor de color. El bloque de propiedades privadas almacena los objetos Line y Patch.

properties
    XData = NaN
    YData = NaN
    ConfidenceMargin = 0.15
    MarkerSymbol = 'o'
    Color = [1 0 0]    
end
    
properties(Access = private,Transient,NonCopyable)
    LineObject
    PatchObject
end   

Método setup

El método setup se ejecuta una vez que MATLAB construye el objeto de la gráfica. Utilice este método para:

  • Llamar a las funciones de representación gráfica para crear los objetos de gráficos primitivos que desea utilizar en la gráfica.

  • Almacenar los objetos primitivos devueltos por las funciones de representación gráfica como propiedades privadas en el objeto de la gráfica.

  • Configurar los objetos de gráficos primitivos.

  • Configurar los ejes.

La mayoría de las funciones de representación gráfica cuenta con un argumento de entrada opcional para especificar los ejes objetivo. Cuando llame a las funciones de representación gráfica desde un método de clase, tiene que especificar los ejes objetivo. Utilice el método getAxes para obtener el objeto de ejes de su gráfica. Después, puede pasar el objeto de ejes a una función de representación o utilizarlo para definir las propiedades de los ejes, como las etiquetas.

Si desea mostrar varios objetos primitivos en los ejes, llame a la función hold entre los comandos de representación. Especifique el argumento de entrada de los ejes cuando llame a la función hold. Vuelva a definir el estado de hold en 'off' tras el último comando de representación.

Por ejemplo, considere una gráfica con estas propiedades:

  • Dos propiedades públicas denominadas XData e YData para almacenar las coordenadas x e y de una línea

  • Dos propiedades privadas denominadas LineObject y PatchObject

El método setup obtiene el objeto de ejes llamando al método getAxes. Después, setup llama a la función plot y almacena el resultado en la propiedad LineObject. Posteriormente, setup define el estado de hold de los ejes en 'on' y, a continuación, llama a la función patch para devolver el valor de la propiedad PatchObject. La última línea del código vuelve a definir el estado de hold de los ejes en 'off'.

function setup(obj)
    % Get the axes
    ax = getAxes(obj);
            
    % Create Patch and Line objects
    obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,...
        'EdgeColor','none');
    hold(ax,'on')
    obj.LineObject = plot(ax,obj.XData,obj.YData);
            
    % Turn hold state off
    hold(ax,'off')
end

Método de actualización

Cuando el usuario cambia uno o varios valores de propiedad en el objeto de la gráfica, MATLAB marca el objeto de la gráfica para su actualización. El método update se ejecuta la próxima vez que se ejecute drawnow. La función drawnow se ejecuta automáticamente de manera periódica, según el estado del entorno de gráficas de la sesión de MATLAB del usuario. De esta manera, se podría producir un retardo entre el cambio de los valores de la propiedad y la visualización de los resultados de dichos cambios.

Utilice el método update para volver a configurar los objetos de gráficos subyacentes de la gráfica según los nuevos valores de las propiedades públicas. Por lo general, este método no distingue cuáles de las propiedades públicas se han cambiado. Este vuelve a configurar todos los aspectos de los objetos de gráficos subyacentes que dependen de las propiedades públicas.

Por ejemplo, considere una gráfica con estas propiedades:

  • Dos propiedades públicas denominadas XData y Color

  • Dos propiedades privadas denominadas LineObject y PatchObject

El método update actualiza las propiedades XData y Color de los objetos Line y Patch.

function update(obj)
            
    % Update XData of line object
    obj.LineObject.XData = obj.XData;
            
    % Update patch XData 
    x = obj.XData;
    obj.PatchObject.XData = [x x(end:-1:1)];
            
    % Update line object colors
    obj.LineObject.Color = obj.Color;
    obj.PatchObject.FaceColor = obj.Color;
           
end

Ejemplo: gráfica con límites de confianza

Este ejemplo muestra cómo crear una gráfica para representar una línea con límites de confianza. Cree un archivo de definición de clase cuyo nombre sea ConfidenceChart.m en una carpeta que se encuentre en la ruta de MATLAB. Defina la clase siguiendo estos pasos.

PasoImplementación

Derive la clase a partir de la clase básica ChartContainer.

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

Defina las propiedades públicas.

    properties
        XData = NaN
        YData = NaN
        ConfidenceMargin = 0.15
        MarkerSymbol = 'o'
        Color = [1 0 0]
    end

Defina las propiedades privadas.

    properties(Access = private,Transient,NonCopyable)
        LineObject
        PatchObject
    end

Implemente el método setup. En este caso, llame a las funciones plot y patch para crear los objetos Patch y Line, respectivamente. Almacene dichos objetos en las propiedades privadas correspondientes.

Vuelva a definir el estado de hold de los ejes en 'off' antes de salir del método.

    methods(Access = protected)
        function setup(obj)
            % get the axes
            ax = getAxes(obj);
            
            % Create Patch and Line objects
            obj.PatchObject = patch(ax,NaN,NaN,'r','FaceAlpha',0.2,...
                'EdgeColor','none');
            hold(ax,'on')
            obj.LineObject = plot(ax,obj.XData,obj.YData);
            
            % Turn hold state off
            hold(ax,'off')
        end

Implemente el método update. En este caso, actualice las coordenadas x e y, el color y el símbolo de marcador de los objetos subyacentes.

        function update(obj)
            % Update XData and YData of Line
            obj.LineObject.XData = obj.XData;
            obj.LineObject.YData = obj.YData;
            
            % Update patch XData and YData
            x = obj.XData;
            obj.PatchObject.XData = [x x(end:-1:1)];
            y = obj.YData;
            c = obj.ConfidenceMargin;
            obj.PatchObject.YData = [y+c y(end:-1:1)-c];
            
            % Update colors
            obj.LineObject.Color = obj.Color;
            obj.PatchObject.FaceColor = obj.Color;
            
            % Update markers
            obj.LineObject.Marker = obj.MarkerSymbol;
        end
    end
end

A continuación, cree una instancia de la gráfica llamando al método constructor implícito con algunas de las propiedades públicas:

x = 0:0.2:10;
y = besselj(0,x);
c = ConfidenceChart('XData',x,'YData',y,'ConfidenceMargin',0.15);

Cambie el color.

c.Color = [0 0 1];

Compatibilidad de las funcionalidades comunes de las gráficas

De forma predeterminada, las instancias de las gráficas son compatibles con muchas de las funcionalidades comunes a todas las gráficas de MATLAB. Por ejemplo, las funciones gca y findobj pueden devolver instancias de la gráfica. También puede pasar instancias de la gráfica a las funciones set y get, además de configurar las propiedades de la gráfica en el Inspector de propiedades.

Las funcionalidades descritas en esta tabla solo son compatibles si las activa en la gráfica.

FuncionalidadDescripciónMás información
Leyenda

Active la función legend y la herramienta de la leyenda en la barra de herramientas de la figura.

matlab.graphics.chartcontainer.mixin.Legend
Barra de colores

Active la función colorbar y la herramienta de la barra de colores en la barra de herramientas de la figura.

matlab.graphics.chartcontainer.mixin.Colorbar
Funciones de conveniencia

Active las funciones que definen propiedades en los ejes, como las funciones title, xlim e ylim.

Activar las funciones de conveniencia para establecer las propiedades de los ejes
Guardar y cargar

Almacene los cambios después de que los usuarios interactúen con la gráfica, de manera que puedan guardar la gráfica y restaurar su estado cuando la vuelvan a cargar en MATLAB.

Guardar y cargar instancias de clases de gráficas

Consulte también

Clases

Funciones

Propiedades

Temas relacionados