如何使用ggplot2在x轴上绘制两列?

时间:2017-10-18 19:48:45

标签: r ggplot2

我使用此代码制作箱图:

Fecundity <- read.csv('Fecundity.csv')

FecundityPlot <- ggplot(Fecundity, aes(x=Group, Sex, y=Fecundity)) + 
  geom_boxplot(fill = fill, color = line) +
  scale_y_continuous(name = "Fecundity") +
  #scale_y_continuous(name = "Fecundity", breaks = seq(0, 80, 10), limits=c(0, 80)) +
  ggtitle("Fecundity") +
  theme(plot.title = element_text(hjust = 0.5))+
  theme_bw(base_size = 11)

我的数据如下:

ID              Group       Sex Generation  Fecundity   Strain
ORR-100-M-01    OR-R-100    M   1             0         ORR
ORR-100-M-02    OR-R-100    M   1             0         ORR
ORR-100-M-03    OR-R-100    M   1             0         ORR
JW-100-M-01     JW-100      M   1            13         JW
JW-100-M-02     JW-100      M   1             0         JW
JW-100-M-03     JW-100      M   1           114         JW

我想制作一个带有ggplot2的boxplot,每个Group和Sex都有一个条形图。因此,对于OR-R100 F旁边的Group = OR-R100 Sex = M,Y轴上会有Fecundity。

此外,如何以所需顺序手动订购盒子,以便我有OR-R-20,OR-R-40等?

2 个答案:

答案 0 :(得分:2)

您可以在aes()内向任何geom_boxplot()(颜色,填充,Alpha等)添加性别,ggplot会自动拆分每组中的女性和男性,并躲避箱图,并显示图例与性。

FecundityPlot <- ggplot(Fecundity, aes(x=Group, Sex, y=Fecundity)) + 
                        geom_boxplot(aes(fill = Sex)) 

或者,如果你想在y轴上放置所有标签,另一种方法是制作一个新的列连接组和性别,然后使用它作为x变量绘图

Fecundity$new.group <- paste(Fecundity$Group, Fecundity Sex)

FecundityPlot <- ggplot(Fecundity, aes(x=new.group, Sex, y=Fecundity)) + 
                        geom_boxplot() 

要为组设置自定义顺序,您需要将Group设为一个因子并定义级别。在factor()中定义级别的顺序将覆盖按字母顺序排列的默认值。

Fecundity$Group <- factor(Fecundity$Group, 
                          levels = c("OR-R-20", "OR-R-40", "JW-100"))

答案 1 :(得分:0)

这是一种方式(使用dplyr/tidyverse管道):

Fecundity %>%
 mutate(Group_sex = paste(Group, Sex)) %>%
 ggplot(aes(x = Group_sex, y = Fecundity)) +
 geom_boxplot()

stringsAsFactors = FALSE来电中使用read.csv,或者更好的是,使用read_csv中较快的tidyverse

要为条形设置顺序,您可以在第一次变异后使用mutate(Group_sex = factor(Group_sex, levels = c( ... ))) %>%行,并在...中提供明确的顺序(如果不同组合的数量很小)。