Histogram bin location to place text for categorical data

27 vues (au cours des 30 derniers jours)
Alessandro Maria Laspina
Alessandro Maria Laspina le 20 Juil 2022
Hello,
I'm trying to find the bin location for categorical data for histogram. Using text I can place the number of the counts for each bin like the following example:
C = categorical(X,1:1:length(categorical_edges_x),categorical_edges_x);
h1=histogram(C);
xloc = h1.BinEdges ;
yloc = h1.Values ;
text(xloc(1:end-1),yloc,num2str(yloc'),'vert','bottom','horiz','center');
The issue is that it doesn't like it when it is categorical, and it returns the following error:
Unrecognized method, property, or field 'BinEdges' for class 'matlab.graphics.chart.primitive.categorical.Histogram'.
Any suggestions?

Réponse acceptée

Voss
Voss le 20 Juil 2022
You can use h1.Categories instead of h1.BinEdges
% a guess at what your X and categorical_edges_x look like
categorical_edges_x = {'A' 'B' 'C' 'D' 'E'};
X = randi(numel(categorical_edges_x),10);
% make the categorical array
C = categorical(X,1:numel(categorical_edges_x),categorical_edges_x);
% make the histogram
h1=histogram(C);
% make the texts
xloc = 1:numel(h1.Categories);
yloc = h1.Values;
text(xloc,yloc,sprintfc('%d',yloc),'vert','bottom','horiz','center')

Plus de réponses (1)

Adam Danz
Adam Danz le 20 Juil 2022
Since you x-data are categorical, you're working with a categorical ruler. This makes it difficult to position text at numeric x-values.
Option 1: don't use categorical data
Produce the histogram using your numeric data and then apply x-tick labels with your category names. You can do this with bar too if you want to keep the gap between cateogries. This will create a numeric xruler and you can position text anywhere along the x-axis.
Option 2: Place your labels along the cateogory values
@Voss provided a nice example of this in the other answer on this page. You could also place the text at the bottom of the bars in white font color, to suggest another style.
Option 3: Add a second row of tick labels in a categorical ruler
If you'd rather use cateogrical values and you want the labels to be at the bottom of the axes but not overlapping the categorical names
A = [1 3 3; 2 1 3; 1 1 2];
values = [1,2,3];
categoryNames = {'red' 'green' 'blue'};
C = categorical(A,values,categoryNames);
h1 = histogram(C);
ax = ancestor(h1,'axes');
tickValues = vertcat(ax.XTickLabel', num2cell(values));
newTickLabels = sprintf('%s\\newline%.0f\n',tickValues{:});
ax.XTickLabel = newTickLabels;

Catégories

En savoir plus sur Data Distribution 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