Controlling colors in scatter plots

10 vues (au cours des 30 derniers jours)
SM1974
SM1974 le 29 Nov 2024
Commenté : DGM le 13 Déc 2024
I have an array of label names that have corresponding RGB triplet colors:
% label names
myLabel = ["tomatoes";"carrots";"blueberries";"beans";"bananas"];
myLabelColor = [0.9 0.0 0.0; 1.0 0.7 0.1; 0.4 0.0 0.8; 0.3 0.7 0.0; 0.9 0.9 0.1];
I want to use these custom colors such that the first element of myLabel is always colored with the first element of myLabelColor in my scatter plots and graphs.
Here is some data:
x = rand(10,1);
y = rand(10,1);
groups = ["bananas"; "blueberries"; "bananas"; "beans"; "beans"; "tomatoes";"blueberries";"bananas";"tomatoes";"tomatoes"];
figure;
gscatter(x,y, groups);
Note that the "carrots" label is missing from this data but may appear in another set of data at some point. I don't know which labels will appear in each data set but I know they will always be ones from myLabel array
In the scatter plot, the groups are identified by Matlab's default colors. How can I edit my code so that the groups are identified by my custom colors (bearing in mind that I will want to scale up to larger data sets that may or may not contain all labels)?

Réponse acceptée

DGM
DGM le 30 Nov 2024
Modifié(e) : DGM le 30 Nov 2024
This is what I threw together, but there's probably a better way to do this; I haven't really used gscatter() for anything before.
% fake data
x = rand(10,1);
y = rand(10,1);
groups = ["bananas"; "blueberries"; "bananas"; "beans"; "beans"; "tomatoes";"blueberries";"bananas";"tomatoes";"tomatoes"];
% label naming info
myLabel = ["tomatoes";"carrots";"blueberries";"beans";"bananas"];
myLabelColor = [0.9 0.0 0.0; 1.0 0.7 0.1; 0.4 0.0 0.8; 0.3 0.7 0.0; 0.9 0.9 0.1];
% gscatter() will list groups based on order of appearance
% figure out which colors are used and the order they're listed
ugroups = unique(groups,'stable');
% then create a new color table ordered to fit the groups as they appear
[islabeled,idx] = ismember(ugroups,myLabel);
if any(~islabeled) % just to avoid confusion
error('grouping variable contains groups which have no assigned label');
end
CT = myLabelColor(idx,:);
% plot it
hs = gscatter(x,y,groups,CT);
  4 commentaires
SM1974
SM1974 le 13 Déc 2024
DGM
DGM le 13 Déc 2024
For future readers, the behavior of legend() has been changing and a lot of old answers may be problematic. Walter's comment is the tip of the iceberg. See also Adam's answer here:
Star Strider and I did a bit of a summary review here:
The short story is that many of these answers rely on an undocumented (iirc deprecated) output from legend() which may cause unexpected formatting problems if its requested. The form of the descendant objects that make up the legend items has also changed over the years, so that changes how one would search for them and/or customize them.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Read, Write, and Modify Image dans Help Center et File Exchange

Produits


Version

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by