To plot one stem with multiple values for data of different months.
조회 수: 4 (최근 30일)
이전 댓글 표시
Dear MATLAB Experts,
I have data in .mat files, each corresponding to a particular month with selected_dates and brightness information.
Each month has a different number of output values (1, 2, 3, ..., N). I need to create a stem plot for each month, with the month on the x-axis and brightness on the y-axis.
For example, if D201701 has six values, the plot will show six values in one single stem, and the x-axis will display the month name.
Additionally, I want to annotate each stem value with a marker (e.g., . or *) to indicate the corresponding date. I have attached an image that shows the stem plot for multiple values, as well as the data and code.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1701416/image.png)
Thank you for guidance and help.
댓글 수: 2
Cris LaPierre
2024년 5월 22일
Are you trying to duplicate the image you shared? If so, I don't see how this is a stem plot, since stem plots would all originate from a common horizontal line. It looks like a bunch of line plots to me.
채택된 답변
Voss
2024년 5월 22일
Maybe something along these lines:
unzip('Processed_results.zip')
% load the files
F = dir(fullfile('Processed_results','*.mat'));
NF = numel(F);
for ii = 1:NF
S = load(fullfile(F(ii).folder,F(ii).name));
F(ii).brightness = S.all_brightness_values;
F(ii).dates = S.selected_dates;
end
% count the number of dates and brightnesses in each file
N_dates = arrayfun(@(x)numel(x.dates),F);
N_brightness = arrayfun(@(x)numel(x.brightness),F);
assert(isequal(N_dates,N_brightness))
% collect date and brightness values into matrices;
% each column is a file, each row is a brightness/date
NB = max(N_brightness);
dates = NaT(NB,NF);
brightness = NaN(NB,NF);
for ii = 1:NF
dates(1:N_dates(ii),ii) = F(ii).dates;
brightness(1:N_brightness(ii),ii) = F(ii).brightness;
end
% construct datetime dt representing the start of each month
dt = datetime(year(dates(1,:)),month(dates(1,:)),1);
% markers to be used in plots
markers = '.*xo+^v<>sdph';
markers = repmat(markers,1,ceil(NB/numel(markers)));
% plot stems
figure('Position',[50 50 1500 600])
hold on
for ii = 1:NB
stem(dt,brightness(ii,:),'Marker',markers(ii),'MarkerSize',12)
end
xticks(min(dt):calmonths(1):max(dt))
% or plot markers only
figure('Position',[50 50 1500 600])
hold on
for ii = 1:NB
plot(dt,brightness(ii,:),'LineStyle','none','Marker',markers(ii),'MarkerSize',12)
end
xticks(min(dt):calmonths(1):max(dt))
추가 답변 (1개)
Mathieu NOE
2024년 5월 22일
hello @Amjad Iqbal
I modified a bit your code
added one line in the first for loop
number_of_data_thismonth(k) = numel(brightnessValues); % <= added this line first
then modified the plot
% original plot
% for i = 1:numel(allDates)
% % Plotting the stem for each date
% stem(allDates(i), allBrightnessValues(i), 'filled');
% % Extracting time information
% time_info = datestr(allDates(i), 'HH:MM:SS');
% % Adding time information on top of each stem
% text(allDates(i), allBrightnessValues(i), time_info, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
% end
% modified plot
nnn = 1+[0 cumsum(number_of_data_thismonth)]; % cumulative sum of nb of data per month
for i = 1:numel(number_of_data_thismonth)
ind_start = nnn(i);
ind_stop = nnn(i+1) - 1;
ll(i) = ind_stop - ind_start +1; % ll is equal to number_of_data_thismonth, so we have a working code
% Plotting the stem for each date
% x position is "center" data
ind = round(mean(ind_start:ind_stop));
stem(repmat(allDates(ind),ll(i),1), allBrightnessValues(ind_start:ind_stop), 'filled');
% Extracting time information
time_info = datestr(allDates(ind_start:ind_stop), 'HH:MM:SS');
% Adding time information on top of each stem
text(repmat(allDates(ind),ll(i),1), allBrightnessValues(ind_start:ind_stop), time_info, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
end
your original plot looks like
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1701691/image.png)
now the modified plot is :
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1701696/image.png)
try it ; hope it helps - full code below
clear;clc;close;
% List all .mat files in the directory
matFiles = dir('*.mat');
% Initialize cell arrays to hold aggregated data
allBrightnessValues = [];
allDates = [];
% Loop through each .mat file
for k = 1:length(matFiles)
% Load the current .mat file
data = load(matFiles(k).name);
% Extract the data
brightnessValues = data.all_brightness_values;
dates = data.selected_dates;
% Ensure data consistency
if isrow(brightnessValues)
brightnessValues = brightnessValues';
end
number_of_data_thismonth(k) = numel(brightnessValues); % <= added this line first
% Convert dates to cell array of strings if necessary
if ischar(dates)
dates = cellstr(dates);
elseif isdatetime(dates)
dates = cellstr(datestr(dates, 'dd-mmm-yyyy HH:MM:ss'));
elseif iscell(dates)
dates = cellfun(@char, dates, 'UniformOutput', false);
else
error('Unexpected date format in file: %s', matFiles(k).name);
end
% Append the data to the aggregated vectors
allBrightnessValues = [allBrightnessValues; brightnessValues];
allDates = [allDates; dates];
end
% Convert the date strings to datetime format
allDates = datetime(allDates, 'InputFormat', 'dd-MMM-yyyy HH:mm:ss');
% Display the size of the aggregated vectors
disp(['Total number of brightness values: ', num2str(length(allBrightnessValues))]);
disp(['Total number of dates: ', num2str(length(allDates))]);
% Plotting
figure;
hold on;
% original plot
% for i = 1:numel(allDates)
% % Plotting the stem for each date
% stem(allDates(i), allBrightnessValues(i), 'filled');
% % Extracting time information
% time_info = datestr(allDates(i), 'HH:MM:SS');
% % Adding time information on top of each stem
% text(allDates(i), allBrightnessValues(i), time_info, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
% end
% modified plot
nnn = 1+[0 cumsum(number_of_data_thismonth)]; % cumulative sum of nb of data per month
for i = 1:numel(number_of_data_thismonth)
ind_start = nnn(i);
ind_stop = nnn(i+1) - 1;
ll(i) = ind_stop - ind_start +1; % ll is equal to number_of_data_thismonth, so we have a working code
% Plotting the stem for each date
% x position is "center" data
ind = round(mean(ind_start:ind_stop));
stem(repmat(allDates(ind),ll(i),1), allBrightnessValues(ind_start:ind_stop), 'filled');
% Extracting time information
time_info = datestr(allDates(ind_start:ind_stop), 'HH:MM:SS');
% Adding time information on top of each stem
text(repmat(allDates(ind),ll(i),1), allBrightnessValues(ind_start:ind_stop), time_info, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
end
hold off;
title('Brightness Temperature vs. Date');
xlabel('Date');
ylabel('Brightness Temperature');
datetick('x', 'yyyy-mm-dd', 'keeplimits');
ylim([180 280])
%%
%Plotting
% figure;
% hold on;
% for i = 1:numel(allDates)
% % Plotting the stem for each date
% stem(allDates(i), allBrightnessValues(i), 'filled');
% % Extracting time information
% time_info = datestr(allDates(i), 'HH:MM:SS');
% % Adding time information on top of each stem
% text(allDates(i), allBrightnessValues(i), time_info, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'center');
% end
% hold off;
% title('Brightness Temperature vs. Date');
% xlabel('Date'); axis normal;
% ylabel('Brightness Temperature');
% datetick('x', 'yyyy-mm-dd', 'keeplimits');
댓글 수: 2
참고 항목
카테고리
Help Center 및 File Exchange에서 Environment and Settings에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!