web-dev-qa-db-fra.com

beaux graphiques à secteurs avec R

Disons que j'ai ces données simples:

 mydata <- data.frame(group=c("A", "B", "0", "AB"), FR=c(20, 32, 32, 16))

Si je veux créer un graphique à secteurs à partir de cette base de données, je peux le faire:

 with(mydata,pie(FR, labels=paste0(as.character(group), " ", FR, "%"), radius=1))

basic pie

C'est assez simple mais acceptable.

Comment puis-je obtenir quelque chose de similaire avec ggplot2 ou treillis?

Après de nombreux essais et erreurs, j'ai

ggplot(mydata, aes(x = factor(1), y=FR,fill=factor(group)) ) + geom_bar(width = 1,stat="identity")+coord_polar(theta = "y") 

ggplot

C'est beaucoup plus complexe et laid. N'est-ce pas censé être facile? Les livres ggplot ne donnent que quelques exemples et découragent l'utilisation des camemberts.

Le treillis est encore pire, vous avez besoin de beaucoup de lignes pour faire peur.

Quelqu'un pourrait-il m'aider à obtenir un graphique circulaire agréable et simple, s'il vous plaît? Par exemple quelque chose comme ...

example1

example2

N'y a-t-il pas un package R capable de le faire facilement, sans 20 lignes de code?

11
skan

Vous pouvez essayer avec la fonction pie3D() du package plotrix:

library(plotrix)
pie3D(mydata$FR, labels = mydata$group, main = "An exploded 3D pie chart", explode=0.1, radius=.9, labelcex = 1.2,  start=0.7)

enter image description here

13
RHertel

Quelques conseils pratiques ici:

Source: Dark Horse Analytics: Salvaging the Pie

(slyly tho, quel est le problème avec un graphique à barres?)

REMARQUE: je n'ai aucune idée de ce que fait Dark Horse Analytics. Ceci est juste mon image de démonstration anti-tarte.

40
hrbrmstr

Pourquoi pas un carré camembert?

devtools::install_github("hrbrmstr/waffle")
library(waffle)

mydata <- c(`A`=20, `B`=32, `0`=32, `AB`=16)
waffle(mydata, title = "Yummy waffle pie!")

enter image description here


Si vous avez plusieurs dimensions d'informations, une autre option pourrait être sunburstR . En utilisant les données browsers de @rawr post , vous pourriez faire:

library(sunburstR)
library(dplyr)
library(tidyr)
browsers %>%
  unite(bv, browser, version, sep = "-") %>%
  select(bv, share) %>%
  sunburst(., count = TRUE)

enter image description here

Vous pouvez utiliser treemap (pour une version interactive, essayez le d3treeR De --- l'opportportfolio package )

library(treemap)
tm <- treemap(
  browsers,
  index=c("browser", "version"),
  vSize="share",
  vColor="share",
  type="value"
)

enter image description here

Vous pouvez également utiliser un diagramme sankey (à partir du networkD3package )

library(networkD3)
df <- browsers %>%
  mutate_each(funs(as.character), browser, version) %>%
  mutate(bn = group_indices_(., .dots = "browser"), 
         cn = max(bn) + row_number()) 

links <- select(df, bn, cn, share)
nodes <- data.frame(name = c("", sort(unique(df$browser)), df$version))

sankeyNetwork(Links = links, Nodes = nodes, Source = "bn",
              Target = "cn", Value = "share", NodeID = "name",
              fontSize = 12, nodeWidth = 30)

enter image description here

39
Steven Beaupré