2017-08-25 3 views
2

Je voudrais obtenir un graphique à barres qui montre une certaine quantité par jour. Cependant, ggplot ne montre pas les jours séparément, mais passe l'été par mois. Comment faire pour que ggplot brise l'axe des x chaque jour?Comment faire pour que ggplot brise l'axe x chaque jour?

C'est le code que j'utilise:

ggplot(aes(x=d.data$a, y= d.data$b), data = d.data) + 
    geom_bar(stat = 'identity', position = 'dodge') + 
    scale_x_date(breaks = '1 day') + 
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) 

Après avoir exécuté le code ci-dessus l'erreur suivante se produit: Error in strsplit(unitspec, " ") : non-character argument

Les données suivantes sont utilisées comme entrée:

d.data <- structure(list(a = structure(c(16771, 16772, 16773, 16774, 16776, 
    16777, 16780, 16781, 16782, 16784, 16785, 16787, 16788, 16789, 
    16790, 16791, 16792, 16796, 16797, 16798, 16799, 16800, 16801, 
    16802, 16803, 16804, 16805, 16806, 16807, 16808, 16809, 16810, 
    16811, 16812, 16813, 16814, 16815, 16816, 16817, 16818, 16819, 
    16820, 16821, 16822, 16823, 16824, 16825, 16826, 16827, 16828, 
    16829, 16830, 16831, 16832, 16833, 16834, 16835, 16836, 16837 
    ), class = "Date"), b = c(5613L, 1374L, 6179L, 2913L, 6628L, 
    3265L, 1763L, 10678L, 7308L, 8686L, 11805L, 4988L, 6584L, 11847L, 
    271L, 8125L, 11227L, 6969L, 8407L, 5083L, 8188L, 10500L, 4592L, 
    8691L, 1121L, 1150L, 3154L, 11724L, 6059L, 2573L, 10244L, 1008L, 
    10938L, 7356L, 1931L, 5182L, 1541L, 10449L, 9948L, 2418L, 10384L, 
    11416L, 8994L, 10652L, 6231L, 3777L, 6079L, 10041L, 10922L, 7410L, 
    1695L, 10890L, 390L, 5635L, 6882L, 6892L, 2807L, 4472L, 5696L 
    )), .Names = c("a", "b"), row.names = c(NA, -59L), class = "data.frame") 

Répondre

4

Utilisation de vos données, vous devez d'abord vous assurer que votre colonne de date est de la classe POSIXct, vous pouvez utiliser le code ggplot ci-dessous:

d.data$a <- as.POSIXct(d.data$a) 

ggplot(aes(x = a, y = b), data = d.data) + 
    geom_bar(stat = 'identity', position = 'dodge') + 
    scale_x_datetime(date_breaks = "1 day") +  ### changed 
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) 

Cela donne le tracé suivant:

enter image description here

+0

Y at-il une raison particulière pour laquelle la colonne de date devrait être 'POSIXct' plutôt que simplement' Date'. Cela change-t-il la façon dont 'ggplot' le rend? – Eumenedies

+0

@Eumenedies Je l'ai essayé en premier avec la classe 'Date'. Cette renvoyé l'erreur suivante: 'Erreur: entrée non valide: time_trans fonctionne avec des objets de POSIXct de classe only' – KoenV

+1

est pas seulement parce que vous avez utilisé' scale_x_datetime' au lieu de 'scale_x_date'? – Eumenedies

0

Bien que vous puissiez spécifier breaks dans scale_x_date(), afin de spécifier des ruptures quotidiennes dans le format en utilisant, l'argument correct est date_breaks. Vous pouvez voir un exemple de son utilisation dans l'aide pour scale_x_date() en exécutant ?scale_x_date.

Ainsi votre code devrait lire:

ggplot(aes(x=a, y= b), data = d.data) + 
    geom_col(position = 'dodge') + 
    scale_x_date(date_breaks = '1 day') + 
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) 
+1

Vrai, mais la question était pourquoi le code lançait une erreur et comment la première ligne est écrite a exactement zéro portant sur cette. – Eumenedies

+1

Vous obtenez cette erreur car vous avez importé les données dans le mauvais format. Je n'ai pas inclus de conversion dans ma réponse pour la simple raison que, si les données utilisées dans la question initiale n'avaient pas été formatées en «Date», cette erreur aurait été jetée au lieu de l'erreur citée. Puisque l'erreur dans la question s'est produite, la colonne a était évidemment déjà 'Date'. – Eumenedies

0

Il semble que la commande a changé * voir (ggplot2 scale x date?): il semble que l'argument a été changé en date_breaks