Matlab: Bar chart x-axis labels missing - matlab

I'm using the following code to create a bar chart in matlab.
a = [1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
bar(a)
set(gca,'XTickLabel',{'one','two','three','four','five','six','seven','eight','nine','zero','one','two','three','four','five','six','seven','eight','nine'})
Code works fine except that x-axis labels don't appear on their corresponding position on the x-axis. How do I resolve this issue?

When you set XTickLabel, you are telling Matlab to replace the text where each tick currently is with new text that you provide. If you run only the first two lines, you will see that Matlab by default has put XTicks on 0:2:20. You can resolve the issue by first telling Matlab to put ticks for each individual bar, and then re-labeling these ticks:
a = [1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
bar(a)
set(gca, 'XTick', 1:length(a))
set(gca,'XTickLabel',{'one','two','three','four','five','six','seven','eight','nine','zero','one','two','three','four','five','six','seven','eight','nine'})
You will have a pretty cluttered x-axis at this point...you would want to look into rotating the XTickLabels with the rotateXLabels function from FileExchange or with the built-in functionality on Matlab14b and later.

Related

How to draw a Histogram in Matlab

I have a set of around 35000 data. These data are the signal strengths received only from a single location for different time interval of time. I want to plot a Histogram using these data. My X-axis will give the information about "Signal Strengths" and my Y-axis will give the information about "Probability". My histogram will consists of different bars which will give information about the signal strength and probabilities.
For example, suppose I have the following data
a= [ 1 1 1 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 5 6 6 6 6 6 6 6 6 6 6 6]
How can I plot the graph using data at X-axis and Probability at Y-axis? Any help will be appreciated. Thanks!
This should work just fine if you don't want to use some predefined functions:
una=unique(a);
normhist=hist(a,size(unique(a),2))/sum(hist(a));
figure, stairs(una,normhist)
Una has only the unique values of a, normhist is now between 0 and 1 and it's the probability of occurring of the individual signal because you divide it by the number of elements included in the data.

Draw lines between coordinates of a matrix in MATLAB

I would like to draw lines between the coordinates of the matrix below and then plot it, it should become an F.
F = ([0 2 2 7 7 2 2 8 8 0 0;0 0 8 8 10 10 14 14 16 16 0])
How can I do this?
You should simply be able to do this with
plot(F(1,:),F(2,:))
the style that you are plotting the data with has many options that you can refer to here http://www.mathworks.co.uk/help/matlab/ref/plot.html
Have you tried this?
plot(F(1,:),F(2,:),'k-.')
I dont have matlab here, but this must work!

Plot on the same figure in Matlab

I have the following code :
clc
clear
x=[1 2.5 2 3 5 6 3.5 2.1 4 .5]
y=[1 3 1.5 2 1.4 5 3.8 2.1 3 3.5]
p=plot(x,y,'r.')
set(p,'MarkerSize',30)
reg=polyfit(x,y,2)
p2=plot(reg)
how can I show both plot in the same figure and also I want axis range to be between 0 and 10.
I think this is what you really want to do:
x=[1 2.5 2 3 5 6 3.5 2.1 4 .5];
[x, inds] = sort(x);
y=[1 3 1.5 2 1.4 5 3.8 2.1 3 3.5];
y = y(inds);
p=plot(x,y,'r.');
set(p,'MarkerSize',30)
set(gca,'XLim',[0 10])
reg=polyfit(x,y,2);
hold on
plot(x, polyval(reg, x))
See http://www.mathworks.com/help/matlab/ref/hold.html
"hold on;"
hold on retains the current graph and adds another graph to it. MATLAB adjusts the axes limits, tick marks, and tick labels as necessary to display the full range of the added graph.

Set x-axis to non-monotonic values and avoid scaling

I use matlab to plot a graph where instead of having x-axis increase monotonically, I have my own values. eg 5 14 8 9 12 7 etc.I use set (gca,'XTickLabel',num2str(mydata)) which generally works. However, when mydata is more than four or five digits, Matlab scales the graph and thus x-axis values no longer correspond to their intended points. Any ideas on how to prevent this scaling? To clarify, when I make the figure larger, it shows the plot as it should.
The problem is in your num2str() conversion:
mydata = 1:10;
num2str(mydata)
ans =
1 2 3 4 5 6 7 8 9 10
This means, that each tick will be labelled with this long 1 by n char array. The axes will then be resized to fit the labels inside the figure.
A solution is to create one label per row of a char array:
reshape(sprintf('%2d',mydata),2,[])'
ans =
1
2
3
4
5
6
7
8
9
10
Sort of solution is to write set(gca,'xtick',1:myDataVectorLength) before set (gca,'XTickLabel',num2str(mydata))

Permutation vectors from the CLUSTERGRAM object (MATLAB)

I'm using the CLUSTERGRAM object from the Bioinformatics Toolbox (ver 3.7).
MATLAB version R2011a.
I'd like to get permutation vectors for row and columns for clustergram, as I can do with dendrogram function:
x = magic(10);
>> [~,~,permrows] = dendrogram(linkage(x,'average','euc'))
permrows =
9 10 6 7 8 1 2 4 5 3
>> [~,~,permcols] = dendrogram(linkage(x','average','euc'))
permcols =
6 7 8 9 2 1 3 4 5 10
I found that the clustering is not the same from clustergram and dendrogram, most probably due to optimal leaf ordering calculation (I don't want to disable it).
For example, for clustergram from:
clustergram(x)
('average' and 'eucledian' are default methods for clustergram)
the vectors (as on the figure attached) should be:
permrows = [1 2 4 5 3 10 9 6 7 8];
permcols = [1 2 8 9 6 7 10 5 4 3];
So, how to get those vectors programmatically? Anybody well familiar with this object?
Do anyone can suggest a good alternative? I know I can create a similar figure combining imagesc and dendrogram functions, but leaf ordering is much better (optimal) in clustergram, than in dendrogram.
From looking at the documentation, I guess that get(gco,'ColumnLabels') and get(gco,'RowLabels'), where gco is the clustergram object, should give you the reordered labels. Note that the corresponding set-methods take in the labels in original order and internally reorders them.
Consequently, if you have used custom labels (set(gco,'RowLabels',originalLabels))
[~,permrows] = ismember(get(gco,'RowLabels'),originalLabels)
should return the row permutation.