Clase de gráfica para representar un mosaico de gráficas de tamaño variable
Este ejemplo muestra la manera de definir una clase para crear un mosaico de gráficas que puede ser de cualquier tamaño, en función del tamaño de los datos del usuario. La gráfica tiene una propiedad Data
pública que acepta una matriz m por n. La gráfica muestra un mosaico cuadrado de n por n de histogramas y diagramas de dispersión. Los diagramas de dispersión muestran las diferentes columnas de datos representados entre sí. Los histogramas muestran la distribución de los valores en cada columna de los datos.
El método update
en esta clase recrea los histogramas y diagramas de dispersión para reflejar los cambios de datos. Si el tamaño de la cuadrícula del diseño entra en conflicto con el tamaño de los datos, se eliminan todos los ejes y se actualiza la propiedad GridSize
para que coincida el tamaño de los datos. Después, se crea un nuevo conjunto de objetos de ejes.
Para definir la clase, copie el siguiente código en el editor y guárdelo con el mismo nombre de TrellisChart.m
en una carpeta grabable.
classdef TrellisChart < matlab.graphics.chartcontainer.ChartContainer properties Data(:,:) {mustBeNumeric} ColNames(1,:) string TitleText(1,:) string end methods (Access = protected) function setup(obj) % Use one toolbar for all of the axes axtoolbar(getLayout(obj),'default'); end function update(obj) % Get the layout and store it as tcl tcl = getLayout(obj); numvars = size(obj.Data,2); % Reconfigure layout if needed if numvars ~= tcl.GridSize(1) % Delete layout contents to change the grid size delete(tcl.Children); if numvars>0 tcl.GridSize = [numvars numvars]; for i = 1:numvars^2 nexttile(tcl,i); end end end % Populate the layout with the axes ax = gobjects(numvars,numvars); for col = 1:numvars for row = 1:numvars % Get the axes at the current row/column t = col + (row-1) * numvars; ax(row,col)=nexttile(tcl,t); if col==row % On the diagonal, draw histograms histogram(ax(row,col),obj.Data(:,col)); ylabel(ax(row,col),'Count') else % Off the diagonal, draw scatters scatter(ax(row,col),obj.Data(:,col),... obj.Data(:,row),'filled','MarkerFaceAlpha',0.6) if length(obj.ColNames) >= row ylabel(ax(row,col),obj.ColNames(row)); end end if length(obj.ColNames) >= col xlabel(ax(row,col),obj.ColNames(col)); end end % Link the x-axis for each column, so that panning or zooming % affects all axes in the column. linkaxes(ax(:,col),'x') end % Chart title title(tcl,obj.TitleText,'FontSize',16); end end end
Después de guardar el archivo de clases, cree una instancia de la gráfica.
load patients chartTitle = "Height, Weight, and Diastolic Blood Pressure"; c = TrellisChart('Data',[Height Weight Diastolic], ... 'colNames', ["Height" "Weight" "Diastolic"],... 'TitleText',chartTitle);