2012-04-10 4 views
4

J'utilise ce qui suit pour tracer le graphique ci-dessous:Afficher uniquement les étiquettes utilisées?

data <- structure(list(Type1 = c("DB", "DB", "DB", "DB", "DB", "DB", 
"DB", "DB", "DB", "DB", "DB", "DB", "DB", "Manual", "Manual", 
"Manual", "Manual", "Manual", "Manual", "Manual", "Manual", "Manual", 
"Manual", "Manual", "Manual", "Manual", "Manual", "Manual"), 
    Type2 = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
    3L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
    3L), Category = c("A", "B", "C", "D", "E", "A", "B", "F", 
    "G", "A", "B", "C", "H", "I", "J", "K", "L", "M", "O", "J", 
    "P", "K", "Q", "M", "K", "P", "J", "P"), Percent = c("83.5106383", 
    "9.574468085", "5.85106383", "0.531914894", "1/188*100", 
    "85.24590164", "11.47540984", "1/61*100", "1.639344262", 
    "90", "3.333333333", "3.333333333", "3.333333333", "20.10582011", 
    "10.05291005", "6.349206349", "5.82010582", "4.761904762", 
    "31.14754098", "16.39344262", "6.557377049", "6.557377049", 
    "4.918032787", "30", "23.33333333", "16.66666667", "10", 
    "6.666666667")), .Names = c("Type1", "Type2", "Category", 
"Percent"), row.names = c(NA, -28L), class = "data.frame") 

data$Percent <- as.numeric(data$Percent) 

g= ggplot(data, aes(x=Category, y=Percent)) + 
      geom_bar(width=0.8, stat="identity", position=position_dodge()) + 
      facet_grid(Type1 ~ Type2,) + 
      theme_bw() + 
      coord_flip() + 
      scale_y_continuous(limits=c(0,100)) 

print(g) 

enter image description here

Est-il possible que je puisse faire la parcelle telle taht chaque ligne utilise uniquement les étiquettes non nulles? Par exemple, prenez la ligne DB. Il utilise seulement 6 étiquettes mais affiche toutes les 16 étiquettes car les 10 autres sont utilisées par la partie Manual des données. De même pour la rangée Manual. Ce que je cherche est quelque chose comme ceci:

 1   2    3 
H 
G 
D          DB 
C 
B 
A 

Q 
P 
O 
G          MANUAL 
M 
L 
K 
J 
I 

Des suggestions sur comment faire cela?

+1

J'ai joué avec cela pour un peu (après avoir fixé les problèmes dans vos données par exemple) et je suis commence à penser qu'il peut y avoir quelques problèmes avec facet_grid et l'argument des échelles. Cependant, vous pouvez également utiliser facet_wrap à la place, et cela semble fonctionner. – joran

+0

@joran: +1 Merci pour votre temps. J'ai joué aussi et je peux confirmer qu'il y a un bug. Je vais le signaler bientôt. – Legend

Répondre

2

Il semble y avoir un bug ou un comportement inattendu lors de la combinaison facet_grid(scales="free") et coord_flip().

Voici 2 possibles contournements:

library(ggplot2) 

# Removed quotes from Percent values, so that Percent will be numeric. 
dat <- structure(list(Type1 = c("DB", "DB", "DB", "DB", "DB", "DB", 
"DB", "DB", "DB", "DB", "DB", "DB", "DB", "Manual", "Manual", 
"Manual", "Manual", "Manual", "Manual", "Manual", "Manual", "Manual", 
"Manual", "Manual", "Manual", "Manual", "Manual", "Manual"), 
    Type2 = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
    3L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
    3L), Category = c("A", "B", "C", "D", "E", "A", "B", "F", 
    "G", "A", "B", "C", "H", "I", "J", "K", "L", "M", "O", "J", 
    "P", "K", "Q", "M", "K", "P", "J", "P"), Percent = c(83.5106383, 
    9.574468085, 5.85106383, 0.531914894, 1/188*100, 
    85.24590164, 11.47540984, 1/61*100, 1.639344262, 
    90, 3.333333333, 3.333333333, 3.333333333, 20.10582011, 
    10.05291005, 6.349206349, 5.82010582, 4.761904762, 
    31.14754098, 16.39344262, 6.557377049, 6.557377049, 
    4.918032787, 30, 23.33333333, 16.66666667, 10, 
    6.666666667)), .Names = c("Type1", "Type2", "Category", 
"Percent"), row.names = c(NA, -28L), class = "data.frame") 

figure_1 = ggplot(dat, aes(x=Category, y=Percent)) + 
      geom_bar(width=0.8, stat="identity") + 
      facet_grid(Type2 ~ Type1, scales="free_x") + 
      theme_bw() + 
      scale_y_continuous(limits=c(0, 100)) + 
      opts(title="Figure 1. Success!\n(But Rotated 90 Degrees)") 

figure_2 = ggplot(dat, aes(x=Percent, y=Category)) + 
      geom_point(size=3) + 
      facet_grid(Type1 ~ Type2, scales="free_y") + 
      theme_bw() + 
      scale_x_continuous(limits=c(0, 100)) + 
      opts(title="Figure 2. Success!\n(But Dotplot Instead Of Barplot)") 

# Unexpected interaction between scales="free" and coord_flip()? 
figure_3 = ggplot(dat, aes(x=Category, y=Percent)) + 
      geom_bar(width=0.8, stat="identity") + 
      facet_grid(Type1 ~ Type2, scales="free") + 
      theme_bw() + 
      scale_y_continuous(limits=c(0, 100)) + 
      coord_flip() + 
      opts(title="Figure 3. Strange Y-axis Behavior.") 

enter image description here enter image description here enter image description here

3

Il supprimera uniquement les éléments qui ne se trouvent dans aucune des facettes. Mais vous pouvez utiliser l'argument scales = "free" dans facet_grid().

g + facet_grid(Type1 ~ Type2, scales="free") 

mais je pense facet_wrap, peut vous fournir une visualisation plus appropriée:

ggplot(data, aes(x=Category, y=Percent)) + 
    geom_bar(width=0.8, stat="identity", position=position_dodge()) + 
    facet_wrap(Type1 ~ Type2,scales="free") + 
    theme_bw() + 
    scale_y_continuous(c(0,100)) + 
    coord_flip() + 
    opts() 

enter image description here

Questions connexes