I have a plot in a for loop and I need to use the legend command to label them. I need to create a array of strings to use the same. For some reason it just doesn't seem to work. Can somebody help. I am pasting the code below.
for i = 1:len
for j = 1:C{i,1}/n
cc = hsv(12);
semilogx(w/pi,Same_psd{i,1}(:,j+1),'color',cc(j+1,:))
str = num2str(Same_mean{i,j+1});
srt_array = [str_array; str];
legend(str_array);
end
end
Try this:
legend_labels = cell(10,1);
for i = 1:10
h(i) = plot(randn(10,1));
hold all
legend_labels{i} = sprintf('This is label #%i', i);
end;
legend(h,legend_labels{:})
Try using the DisplayName property. Has the nice side effect that you can guaranty the legend is in sync with your lines.
eg:
clf
hold on
for i = 1:10
col = rand(3,1);
semilogx(1:10,rand(10,1),'DisplayName',sprintf('This is curve %i',i),...
'color',col)
end
legend('Location','best')
Related
i have this subroutine that i use to make labels. for some reason i cant just make another subroutine where instead of "CGI_SAMPLE_LABEL" it uses "YCI_SAMPLE_LABEL" because of other subroutines. any suggestions on how i can add this so that it chooses either one or the other. if tried using WHERE OR but that didn't work. i edited some of the tags because LIMS basic language is also like smalltalk.
LabelType = "CGI_SAMPLE_LABEL"
pTableNameStr = "SAMPLE"
pLabelNameStr = "CGI_SAMPLE_LABEL"
'Breakpoint(aReason)
NumSamples = Ubound(selectedObjects, 1)
FOR X = 1 TO NumSamples
SampleNumber = selectedObjects[x]
pKeyNameArr[1] = SampleNumber
pNumLabelsInt = 1
pLabelNameStr = "CGI_SAMPLE_LABEL"
pReasonStr = "Auto Label Generation"
pActivityStr = "Label printed for sample logged event"
GOSUB FN_LABEL_PRINT_ALL
NEXT 'Sample
RETURN
I'm using MATLAB 2017a and have been using xlswrite in the past to perform this operation. The problem I ran into was with execution speed and I was looking for a better way. So, I decided to use actxserver and write data using get(obj) from MATLAB and Range.Value from ActiveX. Here's what the code looks like:
e = actxserver('Excel.Application);
eWorkbook = e.Workbooks.Add;
e.Visible = 1;
eSheets = e.ActiveWorkbook.Sheets;
eSheet1 = eSheets.get('Item',1);
eSheet1.Activate;
A = ["Str1";"Str2";"Str3";];
eActivesheetRange = get(e.Activesheet, 'Range', 'A1:A3');
eActivesheetRange.Value = A;
This inocuous bit of code does not execute, nor does it throw a warning or error message.. Nothin'. In my mind, the eActivesheetRange evaluates to: Range("A1:A3") on the ActiveX side. Interestingly, if I replace
A = ["Str1";"Str2";"Str3";];
with
A = char(["Str1";"Str2";"Str3";]);
then the program writes the A char array to each cell in the eActivesheetRange Range.
Is there a way to call cells() using the MATLAB Range.Value connection? Would cells().Value be able to solve this problem?
I don't think writing to Excel using ActiveX is able to handle string types properly. In this case, you can make it work by simply converting your string array into a cell array of character vectors using cellstr. Changing your last line of code to the following works for me (in R2016b):
eActivesheetRange.Value = cellstr(A);
Replacing the last two lines with the following also works:
e.Activesheet.Range('A1:A3').Value = cellstr(A);
The solution to this is of course, a for loop.
alphacolumn=char(97:117);
% iterate through data array
for i=1:21
str=string(alphacolumn(i))+2;
str2=string(alphacolumn(i))+202;
write1=char(str+":"+str2);
if ~isreal(tsc{i,1})
T = (tsc{i,1});
for j = 1:length(T)
rrange = xl.ActiveWorkbook.Activesheet.Range(char(string(alphacolumn(i)) + string(j+1)));
xlcompatiblestring1 = char(string(T(j,:,:)));
rrange.Value= xlcompatiblestring1;
end
else
tsci=tsc{i,1};
% write data to xl target file
%xlswrite(xlfilepath,tsci,write1);
xlActivesheetRange = get(xl.Activesheet,'Range',write1);
xlActivesheetRange.Value = tsci;
end
end
Hi I try to change the color of my excel bar chart via MATLAB.
wksheet = eWorkbook.Worksheets.Item('Sheet2');
co = wksheet.ChartObjects.Item(1); % select the plot (this selects the first plot)
nbSeries = co.Chart.SeriesCollection.count;
% Delete previous series
for i= 1:nbSeries
Series = invoke(co.Chart,'SeriesCollection',1);
invoke(Series,'Delete');
end
% Create Series
nbNewSeries = size(organizedData.Page2.CorrToIndex2Txlsx,1);
for ii = 1:nbNewSeries
NewSeries = invoke(co.Chart.SeriesCollection,'NewSeries');
NewSeries.XValues = organizedData.Page2.CorrToIndex2Txlsx(ii,2);
NewSeries.Values = organizedData.Page2.CorrToIndex2Txlsx(ii,3);
NewSeries.Name = organizedData.Page2.CorrToIndex2Txlsx{ii,1};
end
I have tried this:
NewSeries3.MarkerBackgroundColor = paletteColors(iii,:)*255;
but I get an error:
Parameter must be scalar.
Do you know how can I change colors from MATLAB?
I'm quite new to Matlab and I'm struggling trying to figure out how to properly preprocess my data in order to make some calculations with it.
I have an Excel table with financial log returns of many companies such that every row is a day and every column is a company:
I imported everything correctly into Matlab like this:
Now I have to create what's caled "rolling windows". To do this I use the following code:
function [ROLLING_WINDOWS] = setup_returns(RETURNS)
bandwidth = 262;
[rows, columns] = size(RETURNS);
limit_rows = rows - bandwidth;
for i = 1:limit_rows
ROLLING_WINDOWS(i).SYS = RETURNS(i:bandwidth+i-1,1);
end
end
Well if I run this code for the first column of returns everything works fine... but my aim is to produce the same thing for every column of log returns. So basically I have to add a second for loop... but what I don't get is which syntax I need to use in order to make that ".SYS" dynamic and based on my array of string cells containing company names so that...
ROLLING_WINDOWS(i)."S&P 500" = RETURNS(i:bandwidth+i-1,1);
ROLLING_WINDOWS(i)."AIG" = RETURNS(i:bandwidth+i-1,2);
and so on...
Thanks for your help guys!
EDIT: working function
function [ROLLING_WINDOWS] = setup_returns(COMPANIES, RETURNS)
bandwidth = 262;
[rows, columns] = size(RETURNS);
limit_rows = rows - bandwidth;
for i = 1:limit_rows
offset = bandwidth + i - 1;
for j = 1:columns
ROLLING_WINDOWS(i).(COMPANIES{j}) = RETURNS(i:offset, j);
end
end
end
Ok everything is perfect... just one question... matlab intellissense tells me "ROLLING_WINDOWS appears to change size on every loop iteration bla bla bla consider preallocating"... how can I perform this?
You're almost there. Use dynamic field names by building strings for fields. Your fields are in a cell array called COMPANIES and so:
function [ROLLING_WINDOWS] = setup_returns(COMPANIES, RETURNS)
bandwidth = 262;
[rows, columns] = size(RETURNS);
limit_rows = rows - bandwidth;
%// Preallocate to remove warnings
ROLLING_WINDOWS = repmat(struct(), limit_rows, 1);
for i = 1:limit_rows
offset = bandwidth + i - 1;
for j = 1:columns
%// Dynamic field name referencing
ROLLING_WINDOWS(i).(COMPANIES{j}) = RETURNS(i:offset, j);
end
end
end
Here's a great article by Loren Shure from MathWorks if you want to learn more: http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/ ... but basically, if you have a string and you want to use this string to create a field, you would do:
str = '...';
s.(str) = ...;
s is your structure and str is the string you want to name your field.
I want to create a loop for the following code . The only thing i need the to loop to do is move to the next column (which would be column F). the rows will stay the same. any suggestions?
xlSheet.Range("e23") = (Me.overrings)
xlSheet.Range("e33") = (Me.overingTax)
xlSheet.Range("e27") = (Me.Sampling)
xlSheet.Range("e28") = (Me.Waste)
xlSheet.Range("e29") = (Me.Promo)
xlSheet.Range("e42") = (Me.Online)
xlSheet.Range("e34") = (Me.freebieTax)
xlSheet.Range("e49") = (Me.totalDepo)
xlSheet.Range("e38") = (Me.CreditCards)
If you really want the same value in the adjacent cell, you can modify your existing code like this (no loop required):
xlSheet.Range("e23:f23") = (Me.overrings)
For x= 5 to 6
With xlSheet.columns(x)
.cells(23).value=Me.overrings
'etc
End with
Next x