New to Dash MATLAB®? See:
- About the Dash for MATLAB® category
- Dash MATLAB® Quickstart. Part I: Download and install
- Dash MATLAB® Quickstart. Part II: Making your first app
- Dash MATLAB® Quickstart. Part III: App layout with bar graph
- Official Dash docs for MATLAB®
Follow this link to see more examples and learn how to use Dash for MATLAB®!
We encorage you to ask any questions you may have about Dash for MATLAB®. We are here to help! You can also share your ideas with the community.
In this example you are going to make an app consisting of a Dropdown, a DataTable and a Graph. The components are linked to each other. The graph will show the data present in the table, while the dropdown chooses between different types of plots (Line, Scatter and Bar in this case).
The app will look like this:
The dropdown can be done with a uidropdown
component. For the table we use a uitable
component, and the data is initialized as an array of x
values between 1 and 20, and random values for the y
axis. The initial graph will be an empty axes
which will be updated via a callback function.
Make a new script called tableGraphApp.m
with the following code:
terminate(pyenv);
clearvars;
uiFigure = uifigure('visible', 'off');
% Dropdown (bar, scatter, line, etc)
dropdown = uidropdown(uiFigure,...
'Items', {'Line'; 'Scatter'; 'Bar'},...
'Value', 'Scatter');
uiDropdown = ui2dash(dropdown, 'my-dropdown');
myDropdownDiv = Html('Div', {uiDropdown, 'style', struct(...
'width', '25%', 'padding', 10)});
% Data
data = table;
a = 50;
b = 100;
N = 20;
data.x = (1:1:N)';
data.y = round((b-a).*rand(N,1) + a, 2);
% DataTable
dataTable = uitable(uiFigure, 'ColumnName', data.Properties.VariableNames,...
'Data', data);
% Define struct which stores uitable properties like styling
dataTable.UserData = struct(...
'editable', true,...
'style_data', struct(...
'width', '100px',...
'maxWidth', '100px',...
'minWidth', '100px',...
'backgroundColor', 'rgb(50, 50, 50)',...
'color', 'white'),...
'style_cell_conditional', {{struct(...
'if', struct('column_id', 'x'),...
'textAlign', 'left')}},...
'style_header', struct(...
'fontWeight', 'bold',...
'backgroundColor', 'rgb(30, 30, 30)'),...
'fill_width', false,...
'style_as_list_view', true);
myTable = ui2dash(dataTable, 'my-table');
myTableDiv = Html('Div', {myTable, 'style', struct(...
'float', 'left', 'margin', 'auto', 'padding', 10)});
% Initial Plot
ax = axes('Tag', 'my-plot');
graph = ui2dash(ax);
myGraphDiv = Html('Div', {graph, 'style', struct(...
'float', 'left', 'margin', 'auto', 'padding', 10)});
components = {myDropdownDiv, myTableDiv, myGraphDiv};
% Define the callbacks
args = {...
argsOut('my-plot', 'figure'),...
argsIn('my-table','data'),...
argsIn('my-dropdown', 'value')};
handle = 'updateGraph'; % Callback function
callbackDat = {args, handle};
% Run the app
startDash(components, 8057, callbackDat, 'SOLAR');
The DataTable has many defined properties. For more details, check the official documentation for DataTable.
Another thing we are doing here is to wrap the components in Html Divs. Doing this makes it easier to style the app by giving styling like padding.
For the callback we need two inputs: the data from the table, and the current value from the dropdown. The output will be the graph.
Make a new function called updateGraph.m
with the following code:
function plotlyFig = updateGraph(tableData, dropdownValue)
n = length(tableData);
x = zeros(1,n);
y = zeros(1,n);
for i=1:n
if ~isnumeric(tableData{i}.x)
x(i) = str2double(tableData{i}.x);
else
x(i) = tableData{i}.x;
end
if ~isnumeric(tableData{i}.y)
y(i) = str2double(tableData{i}.y);
else
y(i) = tableData{i}.y;
end
end
close all;
switch dropdownValue % {'Line'; 'Scatter'; 'Bar'}
case 'Line'
plot(x,y, 'LineWidth', 1.5);
case 'Scatter'
scatter(x, y, 80, 'filled')
case 'Bar'
bar(y)
end
xlabel(gca, 'x', 'FontSize', 16);
ylabel(gca, 'y', 'FontSize', 16);
title(strcat(dropdownValue, ' Plot'), 'FontSize', 20);
fig = fig2plotly(gcf, 'offline', true, 'open', false, 'Visible', false);
addtheme(fig, 'plotly_dark');
plotlyFig1 = {struct('data', {fig.('data')}, 'layout', fig.('layout'))};
plotlyFig = char(jsonencode(plotlyFig1));
end
That’s it! You can try to add another type of plot, change the stylings, etc. You can even try to add a third column to the DataTable (z
) and make 3D plots. Have fun!