2012-05-23 57 views
2

我真的很喜歡我的dotplot與facet_wrap(facet標籤頂部)相似,但我最好能夠將它傳遞給一個空格=「free_x」,這樣facets的大小適當。 facet_grid的問題是facet標籤移動到了plot的一側,在這種情況下,這種方式效果不佳,因爲我希望每個面板都是分開的。ggplot2 dotplot with facet_grid with top ala facet_wrap(但是w/space =「free_x」)?

代碼如下:

# load data 
plotdat <- structure(list(level = c("Lost (N =328)", "Won (N =75)", "Lost (N =10)", 
         "Won (N =65)", "Challenger (N =318)", "Incumbent (N =85)", "Arab (N =7)", 
         "Black (N =222)", "East Asian (N =40)", "Latino (N =107)", "Other (N =10)", 
         "South Asian (N =17)", "Not (N =252)", "Statewide (N =151)"), 
       mean = c(0.59834264517378, 0.645308353066667, 0.6382179387, 
         0.646399186046154, 0.595756747751572, 0.649457274258823, 
         0.682776774142857, 0.557334915725225, 0.6654738063, 0.68260777364486, 
         0.6061308922, 0.613378378411765, 0.616298597519841, 0.591703758423841 
       ), se = c(0.00597842210656315, 0.0113080614816089, 0.044927778673023, 
         0.011274258338002, 0.00622316181664198, 0.00900474213888581, 
         0.0247451786416615, 0.00690804451732034, 0.0116899960061005, 
         0.00777478853477299, 0.0183766282892234, 0.0166464474073244, 
         0.00669527297092827, 0.00887170639612841), N = c(328L, 75L, 
         10L, 65L, 318L, 85L, 7L, 222L, 40L, 107L, 10L, 17L, 252L, 
         151L), var = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 
           4L, 4L, 4L, 4L, 5L, 5L), .Label = c("Primary Election", "General Election", 
           "Incumbency", "Race", "Statewide District"), class = "factor")), .Names = c("level", 
       "mean", "se", "N", "var"), row.names = c(NA, 14L), class = "data.frame") 
library('ggplot2') 

# with facet_wrap: 
ggplot(plotdat, aes(x = mean, xmin = mean-se, xmax = mean+se, y = level)) + 
    geom_point() + geom_segment(aes(x = mean-se, xend = mean+se, 
        y = level, yend=level)) + 
    facet_wrap(~var, ncol=1, scales = "free_y") + 
    theme_bw() + opts(axis.title.x = theme_text(size = 12, vjust = .25))+ 
    xlab("Mean V (Brightness) for Candidate's Face") + ylab("") + 
    opts(title = expression("Skin Complexion for 2010 Minority Candidates")) 

# with facet_grid: 
ggplot(plotdat, aes(x = mean, xmin = mean-se, xmax = mean+se, y = level)) + 
    geom_point() + geom_segment(aes(x = mean-se, xend = mean+se, 
        y = level, yend=level)) + 
    facet_grid(var~., scales = "free_y", space = "free_y") + 
    theme_bw() + opts(axis.title.x = theme_text(size = 12, vjust = .25))+ 
    xlab("Mean V (Brightness) for Candidate's Face") + ylab("") + 
    opts(title = expression("Skin Complexion for 2010 Minority Candidates")) 

有什麼建議?非常感謝!

回答

3

更新使用ggplot grob,這相當容易。見herehere

ggplot GROB版本

library(ggplot2) 
library(dplyr) 
library(grid) 

# Get the plot; plotdat data frame is below 
p = ggplot(plotdat, aes(x = mean, xmin = mean-se, xmax = mean+se, y = level)) + 
    geom_point() + geom_segment(aes(x = mean-se, xend = mean+se, 
        y = level, yend=level)) + 
    facet_wrap(~var, ncol=1, scales = "free_y") + 
    theme_bw() + theme(axis.title.x = element_text(size = 12, vjust = .25))+ 
    xlab("Mean V (Brightness) for Candidate's Face") + ylab("") + 
    ggtitle("Skin Complexion for 2010 Minority Candidates") 


# From 'plotdat', get the number of 'levels' for each 'var'. 
# That is, the number y-breaks in each panel. 
N <- plotdat %>% group_by(var) %>% 
    summarise(count = n()) %>% 
    `[[`(2) 

# Get the ggplot grob 
gt = ggplotGrob(p) 

# Get the locations of the panels in the gtable layout. 
panels <- gt$layout$t[grepl("panel", gt$layout$name)] 

# Replace the default panel heights with relative heights 
gt$heights[panels] <- unit(N, "null") 

## Draw gt 
grid.newpage() 
grid.draw(gt) 

enter image description here




原來的答覆 編輯:更新至ggplot2版本0.9.3.1

這不會回答你的問題。它調整了facet_grid的樣子。

我不確定你的意思是「每個面板被分開」。如果您擔心facet_grid繪圖中的條形文字超出了條的邊界,則可以使用theme(strip.text.y = element_text(angle = 0))旋轉文字。此外,可以使用stingr包中的str_wrap將文本打包成多行。

# load data 
plotdat <- structure(list(level = c("Lost (N =328)", "Won (N =75)", "Lost (N =10)", 
         "Won (N =65)", "Challenger (N =318)", "Incumbent (N =85)", "Arab (N =7)", 
         "Black (N =222)", "East Asian (N =40)", "Latino (N =107)", "Other (N =10)", 
         "South Asian (N =17)", "Not (N =252)", "Statewide (N =151)"), 
       mean = c(0.59834264517378, 0.645308353066667, 0.6382179387, 
         0.646399186046154, 0.595756747751572, 0.649457274258823, 
         0.682776774142857, 0.557334915725225, 0.6654738063, 0.68260777364486, 
         0.6061308922, 0.613378378411765, 0.616298597519841, 0.591703758423841 
       ), se = c(0.00597842210656315, 0.0113080614816089, 0.044927778673023, 
         0.011274258338002, 0.00622316181664198, 0.00900474213888581, 
         0.0247451786416615, 0.00690804451732034, 0.0116899960061005, 
         0.00777478853477299, 0.0183766282892234, 0.0166464474073244, 
         0.00669527297092827, 0.00887170639612841), N = c(328L, 75L, 
         10L, 65L, 318L, 85L, 7L, 222L, 40L, 107L, 10L, 17L, 252L, 
         151L), var = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 
           4L, 4L, 4L, 4L, 5L, 5L), .Label = c("Primary Election", "General Election", 
           "Incumbency", "Race", "Statewide District"), class = "factor")), .Names = c("level", 
       "mean", "se", "N", "var"), row.names = c(NA, 14L), class = "data.frame") 
library('ggplot2') 
library(stringr) 

plotdat$var = str_wrap(plotdat$var, width = 10) 

# with facet_grid: 
ggplot(plotdat, aes(x = mean, xmin = mean-se, xmax = mean+se, y = level)) + 
    geom_point() + geom_segment(aes(x = mean-se, xend = mean+se, 
        y = level, yend=level)) + 
    facet_grid(var~., scales = "free_y", space = "free_y") + 
    theme_bw() + 
    ggtitle("Skin Complexion for 2010 Minority Candidates") + 
    xlab("Mean V (Brightness) for Candidate's Face") + ylab("") + 
    theme(axis.title.x = element_text(size = 12, vjust = .25), 
      strip.text.y = element_text(angle = 0)) 

如果「要分離板」是指「在板之間的額外空間」,使用theme(panel.margin = unit(2, "line"),裝載grid後。

library(grid) 
ggplot(plotdat, aes(x = mean, xmin = mean-se, xmax = mean+se, y = level)) + 
    geom_point() + geom_segment(aes(x = mean-se, xend = mean+se, 
        y = level, yend=level)) + 
    facet_grid(var~., scales = "free_y", space = "free_y") + 
    theme_bw() + 
    ggtitle("Skin Complexion for 2010 Minority Candidates") + 
    xlab("Mean V (Brightness) for Candidate's Face") + ylab("") + 
    theme(axis.title.x = element_text(size = 12, vjust = .25), 
      strip.text.y = element_text(angle = 0), 
      panel.margin = unit(2, "lines")) 

enter image description here

+0

由於桑迪,是啊,也許這更是一個功能要求的... – Solomon