Two labels for xaxis for bar graph

12 vues (au cours des 30 derniers jours)
Kamran Mukhtar
Kamran Mukhtar le 7 Avr 2020
Hi
I have array of some positive and negative values and draw bar graph. I want to label top and bottom of x-axis based upon positive and negative values.
  3 commentaires
Kamran Mukhtar
Kamran Mukhtar le 8 Avr 2020
ap=find(a>=0);
apv=a(ap);
namep=name(ap);
an=find(a<0);
anv=a(an);
namen=name(an);
figure(1)
bar(ap,apv)
set(gca,'xtick',ap,'xticklabel',name(ap),'fontsize',8);xtickangle(90)
set(gca,'xaxisLocation','top')
hold on
bar(an,anv)
set(gca,'xtick',an,'xticklabel',name(an),'fontsize',8);xtickangle(90)
set(gca,'xaxisLocation','bottom')
Where a is array consisting of positive and negative numbers and names is corresponding xlabels
dpb
dpb le 8 Avr 2020
Modifié(e) : dpb le 8 Avr 2020
...
bar(ap,apv)
set(gca,'xtick',ap,'xticklabel',name(ap),'fontsize',8);xtickangle(90)
set(gca,'xaxisLocation','top')
hold on
bar(an,anv)
set(gca,'xtick',an,'xticklabel',name(an),'fontsize',8);xtickangle(90)
set(gca,'xaxisLocation','bottom')
You have only one axis here so you can't have two 'XAxisLocation' positions...you can switch the location back and forth from top to bottom as you've done here, but you can't have two...

Connectez-vous pour commenter.

Réponse acceptée

dpb
dpb le 8 Avr 2020
Modifié(e) : dpb le 8 Avr 2020
Per above, you must have a second axes. And, you can do it with only one bar plot instead of two...
ip=(a>=0); % logical vector
in=find(~ip); % convert to position array for negative
ip=find(ip); % ditto now for negative
figure(1)
hBar=bar(a); % draw bargraph, all data first..
hAx=gca; % get axes handle
hAx(2)=axes('Position',hAx.Position,'XAxisLocation','top','Color','none'); % make the second axes
hAx(2).Xlim=hAx(1).Xlim; % make limits match
hAx(2).Ylim=hAx(1).Ylim; hAx(2).YTick=''; % and hide y axis labels
set(hAx,'Box','off'); % so ticks don't show on opposite axis
% now fixup the bar plot to look as desired...
hBar.Color='flat'; % so can use CData array for colors by bar
hBar.CData(in,:)=repmat([1 0 0],numel(in),1); % negative bars red
set(hAx(1),'xtick',in,'xticklabel',name(in),'fontsize',8);xtickangle(hAx(1),90)
set(hAx(2),'xtick',ip,'xticklabel',name(ip),'fontsize',8);xtickangle(hAx(1),90)
Caveat: Air code; I did a sample with made up data here to get the desired effect and then edited on your code to try to match...may be a few typos or oversights but idea will work...the figure I had here that used data from another earlier Answers Q? that was counting letters in a string <Answers/515440-how-can-i-create-a-array-of-letters-from-a-sentence> for the data (the data plotted here are the counts minus mean counts excluding the blanks):
  1 commentaire
Kamran Mukhtar
Kamran Mukhtar le 9 Avr 2020
You are great...Thanks

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur 2-D and 3-D Plots dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by