2017-10-13 4 views
0

Le code suivant crée un histogramme et place l'étiquette de comptage sur chaque barre.Utiliser des étiquettes personnalisées dans stat_bin ggplot

breaks=seq(0,100,by=10) 
ggplot(df, aes(x=spread,y=..count../sum(..count..))) + 
    stat_bin(breaks=breaks,fill='red',colour='black')+ 
stat_bin(breaks=breaks,geom='text',aes(label=..count..),vjust=-1.5,pad=FALSE)+ 
    scale_x_continuous(breaks=breaks) 

Il y a 10 bacs et je voudrais mettre mon propre étiquette (comptez pas) sur chaque barre , par exemple

my_label=log(1:10) #Could be anything here 
ggplot(df, aes(x=spread,y=..count../sum(..count..))) + 
    stat_bin(breaks=breaks,fill='red',colour='black')+ 
    stat_bin(breaks=breaks,geom='text',aes(label=my_label),vjust=-1.5,pad=FALSE)+ 
    scale_x_continuous(breaks=breaks) 

Si je le fais de cette façon que je reçois une erreur: Error: Aesthetics must be either length 1 or the same as the data (847): label, x

Y at-il une façon simple de le faire? Je comprends que certaines personnes suggèrent d'utiliser le paquet dplyr et de modifier la trame de données (df), en créant essentiellement une trame de données des statistiques de la trame de données d'origine. Y a-t-il quelque chose de plus simple que cela? Après tout, nous utilisons le tracé d'histogramme pour éviter d'effectuer le binning et les statistiques nous-mêmes.

+0

Avez-vous regardé '? Geom_histogram' –

+0

con vous fournir quelques exemples de données, par exemple en utilisant 'dput (df)' – Jimbou

Répondre

0
library(ggplot2) 
set.seed(1) 
breaks <- seq(0,100,by=10) 
df <- data.frame(spread = rnorm(1000,50,10)) 
my_label <- letters[1:10] #Could be anything here 
ggplot(df, aes(x=spread,y=..count../sum(..count..))) + 
    stat_bin(breaks=breaks,fill='red',colour='black')+ 
    stat_bin(breaks=breaks,geom='text',label=my_label,vjust=-1.5,pad=FALSE)+ 
    scale_x_continuous(breaks=breaks) 

enter image description here

EDIT
Voici une solution pour une autre question posée par @ user5768239:
Est-il possible d'enlever les étiquettes où ..count .. == 0?

breaks <- seq(0,100,by=10) 
set.seed(123) 
df <- data.frame(spread = rnorm(1000,40,8)) 
spread_cat <- cut(df$spread, breaks=breaks) 
tbl <- table(spread_cat) 
my_label <- letters[1:10] #Could be anything here 
my_label[tbl==0] <- "" 
ggplot(df, aes(x=spread,y=..count../sum(..count..))) + 
    stat_bin(breaks=breaks,fill='red',colour='black')+ 
    stat_bin(breaks=breaks,geom='text',label=my_label,vjust=-1.5,pad=FALSE)+ 
    scale_x_continuous(breaks=breaks) 

enter image description here

+0

Cela fonctionne, merci! – user5768239

+0

Existe-t-il un moyen de supprimer les étiquettes 'a' et 'j' où ..count .. == 0? Il ne semble pas que nous puissions utiliser ..count .. en dehors de aes(). – user5768239

+0

Merci. Que faire si je ne sais pas à l'avance quelles étiquettes ont ..count .. == 0 et que vous souhaitez supprimer celles-ci? – user5768239