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.
Componente | Descripción |
---|---|
Bloque de propiedad pública | 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 | 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:
|
Método | 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. |
Método | Este método actualiza los objetos subyacentes en su gráfica. Se ejecuta durante la siguiente ejecución de Defina este método en el mismo bloque protegido que el método |
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
yYData
para almacenar las coordenadas x e y de la líneaDos propiedades privadas denominadas
LineObject
yPatchObject
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. Por lo general, este método no distingue cuál de las propiedades se ha cambiado. Este vuelve a configurar todos los aspectos de los objetos de gráficas subyacentes que dependen de las propiedades.
Por ejemplo, considere una gráfica con estas propiedades:
Dos propiedades públicas denominadas
XData
yColor
Dos propiedades privadas denominadas
LineObject
yPatchObject
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.
Paso | Implementación |
---|---|
Derive la clase a partir de la clase básica |
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 Vuelva a definir el estado de permanencia de los ejes en |
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 |
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.
Funcionalidad | Descripción | Más información |
---|---|---|
Leyenda | Active la función | matlab.graphics.chartcontainer.mixin.Legend |
Barra de colores | Active la función | 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 | 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. | Guardar y cargar instancias de clases de gráficas |