Je suis en train de faire un barplot dodé dans ggplot2 et un groupe a un compte zéro que je veux afficher. Je me suis souvenu de l'avoir vu sur ICI il y a quelque temps et j'ai pensé que la scale_x_discrete(drop=F)
fonctionnerait. Il ne semble pas fonctionner avec les barres en pointillé. Comment puis-je afficher le nombre de zéro?
Par exemple, (code ci-dessous) dans l'intrigue ci-dessous, le type8 ~ group4 n'a pas d'exemple. Je voudrais quand même que l’intrigue affiche l’espace vide pour le compte zéro au lieu d’éliminer la barre. Comment puis-je faire ceci?
mtcars2 <- data.frame(type=factor(mtcars$cyl),
group=factor(mtcars$gear))
m2 <- ggplot(mtcars2, aes(x=type , fill=group))
p2 <- m2 + geom_bar(colour="black", position="dodge") +
scale_x_discrete(drop=F)
p2
Le seul moyen que je connaisse est de pré-calculer les comptes et d'ajouter une ligne fictive:
dat <- rbind(ddply(mtcars2,.(type,group),summarise,count = length(group)),c(8,4,NA))
ggplot(dat,aes(x = type,y = count,fill = group)) +
geom_bar(colour = "black",position = "dodge",stat = "identity")
Je pensais qu'utiliser plutôt stat_bin(drop = FALSE,geom = "bar",...)
fonctionnerait, mais apparemment cela ne fonctionne pas.
Mise à jour geom_bar()
a besoin de stat = "identity"
Pour ce que ça vaut: La table des comptes, dat, ci-dessus contient NA. Parfois, il est utile d’avoir un 0 explicite à la place; par exemple, si l'étape suivante consiste à mettre les comptes au-dessus des barres. C'est ce que fait le code suivant, bien qu'il ne soit probablement pas plus simple que celui de Joran. Il comporte deux étapes: obtenez un tableau croisé des comptages en utilisant dcast
, puis faites fondre le tableau en utilisant melt
, suivi de ggplot()
comme d'habitude.
library(ggplot2)
library(reshape2)
mtcars2 = data.frame(type=factor(mtcars$cyl), group=factor(mtcars$gear))
dat = dcast(mtcars2, type ~ group, fun.aggregate = length)
dat.melt = melt(dat, id.vars = "type", measure.vars = c("3", "4", "5"))
dat.melt
ggplot(dat.melt, aes(x = type,y = value, fill = variable)) +
geom_bar(stat = "identity", colour = "black", position = position_dodge(width = .8), width = 0.7) +
ylim(0, 14) +
geom_text(aes(label = value), position = position_dodge(width = .8), vjust = -0.5)
Voici comment vous pouvez le faire sans créer d’abord des tableaux récapitulatifs.
Cela ne fonctionnait pas dans ma version CRAN (2.2.1), mais dans la dernière version de développement de ggplot (2.2.1.900), je n’avais aucun problème.
ggplot(mtcars, aes(factor(cyl), fill = factor(vs))) +
geom_bar(position = position_dodge(preserve = "single"))
J'ai posé la même question, mais je voulais seulement utiliser data.table
, car c'est une solution plus rapide pour des ensembles de données beaucoup plus volumineux. J'ai inclus des notes sur les données afin que ceux qui sont moins expérimentés et qui veulent comprendre pourquoi j'ai fait ce que j'ai fait puissent le faire facilement. Voici comment j'ai manipulé le jeu de données mtcars
:
library(data.table)
library(scales)
library(ggplot2)
mtcars <- data.table(mtcars)
mtcars$Cylinders <- as.factor(mtcars$cyl) # Creates new column with data from cyl called Cylinders as a factor. This allows ggplot2 to automatically use the name "Cylinders" and recognize that it's a factor
mtcars$Gears <- as.factor(mtcars$gear) # Just like above, but with gears to Gears
setkey(mtcars, Cylinders, Gears) # Set key for 2 different columns
mtcars <- mtcars[CJ(unique(Cylinders), unique(Gears)), .N, allow.cartesian = TRUE] # Uses CJ to create a completed list of all unique combinations of Cylinders and Gears. Then counts how many of each combination there are and reports it in a column called "N"
Et voici l'appel qui a produit le graphique
ggplot(mtcars, aes(x=Cylinders, y = N, fill = Gears)) +
geom_bar(position="dodge", stat="identity") +
ylab("Count") + theme(legend.position="top") +
scale_x_discrete(drop = FALSE)
Et il produit ce graphique:
De plus, s'il existe des données continues, telles que celles du jeu de données diamonds
(grâce à mnel):
library(data.table)
library(scales)
library(ggplot2)
diamonds <- data.table(diamonds) # I modified the diamonds data set in order to create gaps for illustrative purposes
setkey(diamonds, color, cut)
diamonds[J("E",c("Fair","Good")), carat := 0]
diamonds[J("G",c("Premium","Good","Fair")), carat := 0]
diamonds[J("J",c("Very Good","Fair")), carat := 0]
diamonds <- diamonds[carat != 0]
Ensuite, utiliser CJ
fonctionnerait également.
data <- data.table(diamonds)[,list(mean_carat = mean(carat)), keyby = c('cut', 'color')] # This step defines our data set as the combinations of cut and color that exist and their means. However, the problem with this is that it doesn't have all combinations possible
data <- data[CJ(unique(cut),unique(color))] # This functions exactly the same way as it did in the discrete example. It creates a complete list of all possible unique combinations of cut and color
ggplot(data, aes(color, mean_carat, fill=cut)) +
geom_bar(stat = "identity", position = "dodge") +
ylab("Mean Carat") + xlab("Color")
En nous donnant ce graphique:
Utilisez count
et complete
à partir de dplyr
pour le faire.
library(tidyverse)
mtcars %>%
mutate(
type = as.factor(cyl),
group = as.factor(gear)
) %>%
count(type, group) %>%
complete(type, group, fill = list(n = 0)) %>%
ggplot(aes(x = type, y = n, fill = group)) +
geom_bar(colour = "black", position = "dodge", stat = "identity")
Vous pouvez exploiter la fonctionnalité de la fonction table()
, qui calcule le nombre d'occurrences d'un facteur pour tout ses niveaux.
# load plyr package to use ddply
library(plyr)
# compute the counts using ddply, including zero occurrences for some factor levels
df <- ddply(mtcars2, .(group), summarise,
types = as.numeric(names(table(type))),
counts = as.numeric(table(type)))
# plot the results
ggplot(df, aes(x = types, y = counts, fill = group)) +
geom_bar(stat='identity',colour="black", position="dodge")