2017-10-18 5 views
1

J'ai un cadre de données avec plus de 40 niveaux de facteur et je voudrais assigner différentes formes pour chaque niveau. Cependant, comme indiqué dans le scale_shapes_table de ggplot2, je peux attribuer seulement 26 d'entre eux et certains !, ", # et ainsi de suite.Affectation de 40 formes ou plus dans scale_shape_manual

enter image description here

Mais je sais que, en python ou JMP vous pouvez affecter de nombreuses formes (comme asteriks, triangle gauche, triangle, rectangle, etc.). Est-il également possible aussi dans ggplot2?

data=data.frame(gr=seq(1,40), x1=runif(40), y1=runif(40)) 
library(ggplot2) 
ggplot(data=data,aes(x=x1,y=y1,shape=factor(gr),col=factor(gr)))+ 
    geom_point(alpha = 0.3,size=4,stroke=1.4) + 
    scale_shape_manual(values=c(0:40)) 

enter image description here

+5

Vous devriez considérez si l'utilisation de tant de formes est une visualisation efficace. Peut-être que vos données peuvent être divisées en un plus petit nombre de catégories? Considérez également les facettes. – neilfws

+0

@neilfws oui je l'ai considéré et j'ai besoin de plusieurs formes autant que possible :) – Alexander

+2

@Alexander Vous n'en avez pas assez. Il est extrêmement difficile et long pour le cerveau humain de distinguer 40 formes. Vous créez une mauvaise visualisation. – Roland

Répondre

5

Un grand nombre de les symboles sont disponibles en utilisant le paquet emojifont e avec Font Awasome (voir la liste complète here). Plus de détails sont donnés here.

library(ggplot2) 
library(emojifont) 
set.seed(1234) 
symbls <- c('fa-github', 'fa-binoculars', 'fa-twitter', 'fa-android', 'fa-coffee', 
'fa-cube', 'fa-ambulance','fa-check','fa-cutlery','fa-cogs','fa-dot-circle-o','fa-car', 
'fa-building','fa-fire', 'fa-flag','fa-female','fa-gratipay','fa-heart','fa-magnet', 
'fa-lock','fa-map','fa-puzzle-piece','fa-shopping-cart','fa-star','fa-sticky-note', 
'fa-stop-circle-o','fa-volume-down','fa-anchor', 'fa-beer','fa-book','fa-cloud', 
'fa-comment','fa-eject','fa-chrome','fa-child','fa-bomb', 'fa-certificate', 
'fa-desktop','fa-fire-extinguisher','fa-diamond') 
idx <- order(symbls) 
fa <- fontawesome(symbls) 
k <- length(fa) 
data=data.frame(gr=factor(fa, levels=fa[idx]), x1=runif(k), y1=runif(k)) 
data$gr <- factor(data$gr, levels=fa[idx]) 

ggplot(data, aes(x1, y1, colour=gr, label=gr)) + 
    xlab(NULL) + ylab(NULL) + geom_point(size=-1) + 
    geom_text(family='fontawesome-webfont', size=6, show.legend=FALSE) + 
    theme(legend.text=element_text(family='fontawesome-webfont')) + 
    scale_colour_discrete("Points",guide=guide_legend(override.aes=list(size=4))) 

enter image description here

Avertissement: si vous voulez utiliser le code dans rstudio, d'abord réassigner le dispositif graphique comme suit (plus de détails sont donnés here):

devtools::install_github("coatless/balamuta") 
library("balamuta") 
external_graphs() 
+0

merci pour la réponse. cet emjifont a-t-il aussi des sybolds mathématiques? ne pouvait pas les trouver? Ou similaire à des symboles de base, mais des formes différentes? – Alexander

+0

J'ai besoin d'un code qui devrait fonctionner dans rstudio :) – Alexander

+0

@Alexander Si vous avez besoin d'utiliser Rstudio, voir la mise à jour de mon message. J'utilise cette solution lorsque les tracés ne sont pas affichés dans Rstudio. –

2

Would en utilisant une combinaison de 5 ou 10 formes distinctes avec des couleurs distinctes suffisantes pour distinguer les 40 points fonctionnent mieux? Je vois cela comme étant visuellement plus facile de différencier les 40 éléments que d'utiliser/de recourir à des symboles inhabituels.

ggplot(data=data,aes(x=x1,y=y1, shape=factor(gr), col=factor(gr)))+ 
geom_point(alpha = 0.5, size=4, stroke=1.4) + 
scale_shape_manual(values=rep(c(0:2,5:6,9:10,11:12,14), times=4)) 

enter image description here

Ou profiter des 5 formes uniques qui prennent les couleurs de remplissage.

ggplot(data=data,aes(x=x1,y=y1, shape=factor(gr), fill=factor(gr), col=factor(gr)))+ 
geom_point(alpha = 0.5, size=4, stroke=1.4) + 
scale_shape_manual(values=rep(c(21:25), times=8)) 

enter image description here

3

Peut-être utiliser gr comme les étiquettes, en utilisant ggrepel, plus facile de trouver un certain nombre de formes comparant:

library(ggrepel) 

ggplot(data = data, aes(x = x1, y = y1, label = gr))+ 
    geom_point() + 
    geom_label_repel() 

enter image description here

+1

Nice, mais encore très encombré. Si cela est techniquement possible, je pourrais utiliser un graphique interactif qui permet au lecteur de mettre en évidence une ou deux catégories en leur attribuant des couleurs. Mais bien sûr, je doute que la cartographie de 40 catégories soit importante. Je pourrais aussi essayer d'agréger les catégories. – Roland

+0

@Roland «brillant» est venu à mon esprit quand j'ai lu le poste, mais je pense que OP veut des intrigues statiques. Oui, cela nécessite plus de regroupement avec les couleurs. – zx8754