2017-10-14 5 views
0

Je voudrais tracer la proportion de la somme des valeurs variables plutôt que la proportion du nombre d'observations.ggplot2 - proportion des sommes pour les graphiques à barres

En ce qui concerne ce dernier, la proportion des observations pour une catégorisation donnée (par exemple de coupe) peut être fait comme ceci:

library(ggplot2) 

ggplot(data=diamonds) + 
geom_bar(aes(x=cut,y=..count../sum(..count..)),position="dodge") 

Afin d'apporter des informations à partir des valeurs d'une autre variables telles que « prix », on peut mapper à « y » et utiliser « notion d'identité »:

ggplot(data=diamonds) + 
geom_bar(aes(x=cut,y=price),stat="identity",position="dodge") 

Cependant, je voudrais combiner les deux traçant la proportion de la somme des valeurs d'une variable (par exemple, la somme des prix) Donc, en quelque sorte, il faut cartographier la variable d'intérêt (e. g. prix) pour dire y qui cependant bloque y pour le calcul de la proportion et je n'ai pas vu de façon évidente à autre que d'agréger les données (que je voudrais éviter). '

Pour mes intensions peut-être plus clair, la solution idéale ressemblerait peut-être quelque chose comme ceci:

ggplot(data=diamonds) + 
geom_bar(aes(x=cut,y=..sum(price)../sum(..sum(price)..)),position="dodge") 

Répondre

1
library(ggplot2) 
library(data.table) 
df <- data.table(data.frame(diamonds)) 
df <- df[,.(value = sum(price)), by = cut] 

windows() 
ggplot(data = df, aes(x = cut, y = value/sum(value))) + 
    geom_bar(position="dodge", stat="identity") 

** New Answer ** 

library(ggplot2) 
library(data.table) 
df <- data.table(data.frame(diamonds)) 

windows() 
ggplot(data = df[,.(value = sum(price)), by = cut], aes(x = cut, y = value/sum(value))) + 
    geom_bar(position="dodge", stat="identity") 
+0

Même si cette solution fonctionne, je cherchais idéalement une solution natif ggplot2 (qui pourrait ne pas exister). Je vais attendre un peu plus longtemps pour d'autres réponses possibles et j'accepterai cette solution si une solution non native surgit. –

+0

qu'est-ce que natif ggplot2? –

+0

Ce que je veux dire est d'utiliser aucune manipulation de données préalable, c'est d'utiliser les données car il laisse ggplot faire les calculs en interne dans les fonctions de construction, etc –

1

vous pouvez le faire avec dplyr:

diamonds %>% 
    group_by(cut) %>% 
    mutate(sum_price = sum(price)) %>% 
    mutate(prop_sum = price/sum_price) %>% 
    ggplot(aes(cut, prop_sum)) + 
     geom_bar(stat = "identity", position = "dodge")