Main Content

La traducción de esta página está obsoleta. Haga clic aquí para ver la última versión 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 gráficas personalizados, puede combinar varios objetos de gráficas, 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, podrá crear una implementación de clases para las gráficas definiendo una subclase de la clase básica ChartContainer. Crear una clase que le permita:

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

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

Al definir 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áficas. Como resultado, las gráficas son compatibles con muchos aspectos del sistema de gráficas. 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 se parece a esto:

classdef ConfidenceChart < matlab.graphics.chartcontainer.ChartContainer

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

ComponenteDescripción

Bloque de propiedad pública
(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 propiedad privada
(recomendado)

Este bloque almacena los objetos de gráficas subyacentes y los detalles de otras implementaciones 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.

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 durante la siguiente ejecución de drawnow, después de que el usuario cambie uno o más valores de propiedad.

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 los 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 y YData, puede crear una instancia de su clase mediante 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 propiedad privada y pública

Divida sus propiedades de clase entre al menos dos bloques:

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

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

Las propiedades que pueden ir al 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 van en el bloque privado almacenan los objetos de gráficas subyacentes que componen la gráfica, además de cualquier valor calculado que desee guardar. Su clase, de forma eventual, 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 propiedad de una gráfica que muestra un objeto Line y un objeto Patch. La propiedad pública 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 propiedad privada 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 gráfica. Los valores de la propiedad pasados como argumentos de par nombre-valor al constructor del método se asignan después de que se ejecute este método.

Utilice el método setup para:

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

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

  • Configurar los objetos de gráficas primitivos.

  • Configurar los ejes.

Muchas funciones gráficas tienen un argumento de entrada opcional para especificar el objeto de ejes de destino. Estas funciones incluyen funciones de representación (como plot, scatter y bar) y funciones que modifican los ejes (como hold, grid y title). Cuando llame a este tipo de funciones de representación gráfica desde un método de clase, tiene que especificar el objeto de ejes objetivo. Puede acceder al objeto de ejes llamando al método getAxes. Este método devuelve el objeto de ejes o crea un objeto de ejes cartesiano si la gráfica no contiene un objeto de ejes previamente.

Precaución

Llamar a funciones de representación o funciones que modifican los ejes sin especificar los ejes de destino puede producir resultados inesperados.

Cuando llame a funciones de representación en el método setup, especifique los valores temporales (como NaN) para obtener los datos de coordenadas. Además, especifique los valores temporales para otros argumentos que correspondan a propiedades públicas de su clase. Al hacerlo se evita establecer los mismos valores de propiedad en los métodos setup y update.

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

Por ejemplo, considere una gráfica que muestra una línea y un parche. Tiene estas propiedades:

  • Dos propiedades públicas denominadas XData y YData para almacenar las coordenadas x e y de la 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, llama a la función patch y almacena el resultado en la propiedad PatchObject. La siguiente línea de código establece el estado de permanencia de los ejes en 'on' antes de llamar a la función plot para crear la propiedad LineObject. La última línea del código vuelve a definir el estado de permanencia 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,NaN,NaN);
            
    % 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 gráfica, MATLAB marca el objeto de gráfica para su actualización. El método update se ejecuta por primera vez después de la primera vez que se ejecute el método setup. Después, se ejecuta la siguiente vez que drawnow se ejecute. 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 en MATLAB del usuario. De esta manera, se podría producir un retardo entre el cambio de los valores de la propiedad y la consulta de los resultados de dichos cambios.

Utilice el método update para volver a configurar los objetos de gráficas subyacentes de la gráfica según los nuevos valores de las propiedades públicas. Por lo general, este método no distingue cuál de las propiedades público se ha cambiado. Este vuelve a configurar todos los aspectos de los objetos de gráficas 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 permanencia 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,NaN,NaN);

            % 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];

Sugerencia

Además de los ejemplos proporcionados en la documentación, podrá encontrar diferentes ejemplos de la comunidad de usuarios en File Exchange, en MATLAB Central™.

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 Property Inspector.

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
Diferentes tipos de ejes o varios ejes

Muestre una o más gráficas cartesianas, polares o geográficas.

Desarrollar gráficas con ejes polares, geográficos o varios ejes
funciones

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

Activación de 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.

Guardado y carga de instancias de clases de gráficas

Consulte también

Clases

Funciones

Propiedades

Temas relacionados