2 votes

ggplot2 - crée un graphique à barres pour chaque colonne d'un cadre de données

Je sais que cette question est vraiment basique, mais je suis un débutant total et j'ai passé toute la journée à essayer de tracer des graphiques individuels pour chaque colonne d'un cadre de données. Toute aide serait très utile

Voici les données :

> dfslices
        X0035.A061 X0094.B116 X0314.A038
verylow   19.48052   8.127208 36.8243243
low        2.96846   9.069494  7.4324324
medium     0.00000   2.237927  0.3378378
high       0.00000   0.000000  1.6891892

En fait, j'ai besoin d'un diagramme à barres pour chaque colonne (X0035.A061, X0094.B116 et X0314.A038). Chaque graphique à barres a 4 barres (une barre correspondant à la catégorie très basse, une autre à la basse, une autre à la moyenne et une autre à la haute). Et ce serait bien que les titres des graphiques soient (X0035.A061, X0094.B116 et X0314.A038) et que chaque barre du graphique ait l'étiquette correspondante (très bas, bas, moyen et haut).

Merci.

7voto

bdemarest Points 5495

Voici une solution au problème en utilisant le data.table pour le melt() y fread() et en utilisant les fonctions facet_grid() de ggplot2 pour tracer les 3 colonnes originales comme des panneaux séparés sur un seul graphique.

library(data.table)
library(ggplot2)

# Convert text data to data.table using fread() from the data.table package.
dfslice = fread("category X0035.A061 X0094.B116 X0314.A038
                 verylow    19.48052   8.127208 36.8243243
                 low         2.96846   9.069494  7.4324324
                 medium      0.00000   2.237927  0.3378378
                 high        0.00000   0.000000  1.6891892")

# Convert data to 'long form' using melt() from the data.table package.
mtab = melt(dfslice, id.vars="category")

# Manually set factor levels of 'category' column to plot in a logical order.
mtab$category = factor(mtab$category, 
                       levels=c("verylow", "low", "medium", "high"))

mtab
#     category   variable      value
#  1:  verylow X0035.A061 19.4805200
#  2:      low X0035.A061  2.9684600
#  3:   medium X0035.A061  0.0000000
#  4:     high X0035.A061  0.0000000
#  5:  verylow X0094.B116  8.1272080
#  6:      low X0094.B116  9.0694940
#  7:   medium X0094.B116  2.2379270
#  8:     high X0094.B116  0.0000000
#  9:  verylow X0314.A038 36.8243243
# 10:      low X0314.A038  7.4324324
# 11:   medium X0314.A038  0.3378378
# 12:     high X0314.A038  1.6891892

p = ggplot(data=mtab, aes(x=category, y=value, fill=category)) +
    geom_bar(stat="identity") +
    scale_fill_viridis_d() +
    facet_grid(. ~ variable)

ggsave("faceted_barplot.png", plot=p, width=7.5, height=2.5, dpi=150)

enter image description here

3voto

markus Points 18578

Voici une option

library(purrr)
library(tibble) # rownames_to_column
library(ggplot2)
plots <- split.default(dfslices, names(dfslices)) %>% 
  map(., setNames, nm = "col") %>% 
  map(., rownames_to_column) %>%
  map(., mutate, rowname = factor(rowname, levels = c("verylow", "low", "medium", "high"))) %>% 
  imap(., ~ {
    ggplot(.x, aes(rowname, col)) + 
      geom_col() +
      labs(title = .y)
    })

plots$X0035.A061

enter image description here

L'idée est de créer une liste de dataframes, chacun contenant une seule colonne de dfslices . Nous utilisons split.default pour créer cette liste.

Dans les deux lignes suivantes, nous renommons les colonnes de chaque dataframe en "col" et pour chaque dataframe nous convertissons ses rownames en une colonne explicite. Prochaine étape, convertir la colonne rowname au facteur et de fixer ses niveaux en conséquence.

Enfin, on peut utiliser imap pour itérer sur la liste et sur les noms de cette liste qui sont symbolisés par .y . Nous utilisons .y en tant qu'argument pour labs pour que le titre de chaque parcelle corresponde à l'(ancien) nom de la colonne.

données

dfslices <- structure(list(X0035.A061 = c(19.48052, 2.96846, 0, 0), X0094.B116 = c(8.127208, 
9.069494, 2.237927, 0), X0314.A038 = c(36.8243243, 7.4324324, 
0.3378378, 1.6891892)), .Names = c("X0035.A061", "X0094.B116", 
"X0314.A038"), class = "data.frame", row.names = c("verylow", 
"low", "medium", "high"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X