2016-08-31 79 views
0

我正試圖在Excel中將圖表1實現爲Shiny。到目前爲止,我得到了結果圖2的代碼。R ggplot //在X軸上的多個分組

ggplot(filteredData(), aes(x=interaction(month, year), y=sum)) 
+ geom_bar(stat="identity") + facet_grid(. ~ X) + theme(legend.position="none") 

我想組個月,像今年在Excel的例子,這樣的帽子你的傳說和第一排(「1」,「2」,...),在只有一個月計數器第二年(「2016」,「2017」,...)。月數可能會有所不同。

數據集的樣子:

X year month sum 
10 2016 1  450 
10 2016 2  670 
... ... ... ... 
10 2017 1  200 
11 2016 1  460 
+0

能否請你添加數據集的例子嗎?看看這個鏈接[如何使一個很好的可重現的問題](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – thepule

回答

1

我稍微改變了數據集,這是我給你的規格最接近:

df <- read.table(text = "X year month sum 
10 2016 1  450 
10 2016 2  670 
10 2017 1  200 
11 2016 1  460 
11 2017 2  500", header = T) 

# Notice the variable type for month and year 
df$month <- as.factor(df$month) 
df$year <- as.factor(df$year) 
df$X <- as.factor(df$X) 

ggplot(df, aes(x = month, y = sum)) + geom_bar(stat = "identity") + 
    facet_grid(.~X + year, 
      switch = "x", # Moves the labels from the top to the bottom 
      labeller = label_both # Adds the labels to the year and X variables 
      ) + 
    xlab("") # Removes the month label 

結果: enter image description here

或者如果你想刪除未使用的級別:

ggplot(df, aes(x = month, y = sum)) + geom_bar(stat = "identity") + 
    facet_grid(.~X + year, 
      switch = "x", # Moves the labels from the top to the bottom 
      labeller = label_both, # Adds the labels to the year and X variables 
      scales = "free_x") + 
    xlab("") # Removes the month legend 

enter image description here

+0

嗨@thepule,我用你的方法來解決我的問題。現在我遇到了問題,我希望所有酒吧都有相同的寬度。目前情況並非如此,因爲2016年僅剩下9 - 12月份,2017年有1 - 9月份的月份,但兩年的所有酒吧都有相同的空間。所以最糟糕的情況是十二月,當一個酒吧充滿整個2016年的空間,十一個酒吧必須分享2017年的空間。 – user6777840

+0

我的代碼: 'ggplot(data01,aes_string(x =「month」,y =「sum」,fill =「cat」)+ geom_bar(stat =「identity」)+ facet_grid(。〜year,scales =「free_x 「)+ xlab(」「)+ ylab(」「)+ theme_light()+ theme(axis.text.x = element_text(angle = 90))' 如果您對我有建議,會非常酷! – user6777840

+0

我不知道如何解決這個問題。我會考慮的。 – thepule

1

你可以得到一個稍微複雜一點,用cowplot的情節融合在一起。您可以使用lapply來自動執行此操作,以循環使用您的唯一值,儘管這對於兩個組來說可能是過度的。

library(ggplot2) 
library(cowplot) 
library(dplyr) 

# Return to default theme, as cowplot sets its own 
theme_set(theme_gray()) 

# Save y limits to get same scale 
myYlims <- c(0, ceiling(max(df$sum)/100)*100) 


# Generate each plot 
x10 <- 
    ggplot(df %>% 
      filter(X == 10) 
     , aes(x = month, y = sum)) + geom_bar(stat = "identity") + 
    facet_grid(~ year, 
      switch = "x") + 
    panel_border() + 
    coord_cartesian(ylim = myYlims) + 
    xlab("X = 10") 


x11 <- 
    ggplot(df %>% 
      filter(X == 11) 
     , aes(x = month, y = sum)) + geom_bar(stat = "identity") + 
    facet_grid(~ year, 
      switch = "x") + 
    panel_border() + 
    coord_cartesian(ylim = myYlims) + 
    xlab("X = 11") 


# Put the plots together 
plot_grid(x10 
      , x11 + 
      theme(axis.title.y = element_blank() 
        , axis.text.y = element_blank() 
        , axis.ticks.y = element_blank()) 
      , rel_widths = c(1.1,1) 
     ) 

enter image description here

下面是自動執行此,包括更復雜的數據來證明的自動化的方法。請注意,您將需要與rel_widths選擇你的輸出和寬高比發揮,使它看起來體面:

df <- 
    data.frame(
    X = rep(1:6, each = 9) 
    , year = rep(rep(2016:2018, each = 3),3) 
    , month = rep(1:3, 6) 
    , sum = rnorm(9*6, 700, 100) 
) 


# Notice the variable type for month and year 
df$month <- as.factor(df$month) 
df$year <- as.factor(df$year) 
df$X <- as.factor(df$X) 


# Save y limits to get same scale 
myYlims <- c(0, ceiling(max(df$sum)/100)*100) 


# Generate each plot 
eachPlot <- lapply(levels(df$X), function(thisX){ 
    ggplot(df %>% 
      filter(X == thisX) 
     , aes(x = month, y = sum)) + 
    geom_bar(stat = "identity") + 
    facet_grid(~ year, 
       switch = "x") + 
    panel_border() + 
    coord_cartesian(ylim = myYlims) + 
    xlab(paste("X =", thisX)) 
}) 


# Remove axes from all but the first 
eachPlot[-1] <- lapply(eachPlot[-1], function(x){ 
    x + 
    theme(axis.title.y = element_blank() 
      , axis.text.y = element_blank() 
      , axis.ticks.y = element_blank() 
    ) 
}) 

# Put the plots together 
plot_grid(plotlist = eachPlot 
      , rel_widths = c(1.4, rep(1, length(eachPlot)-1)) 
      , nrow = 1 
) 

enter image description here

+0

嗨馬克,謝謝你的回答。我的報告有大量的X。你能告訴我你如何用不同數量的X生成這個? – user6777840

+0

@ F.Gr。我添加了一些更復雜的數據,並展示了我將採用的「lapply」方法的一個示例。 –

+0

如果X不是一個數字而是一個字符串,這會如何改變? 試圖調整它,但我是一種新的R,所以它沒有工作:( – user6777840