ixxmu / mp_duty

抓取网络文章到github issues保存
https://archives.duty-machine.now.sh/
122 stars 30 forks source link

跟着Nature Genetics用ggplot2画一张经典款分组柱状图,长宽数据转换 #4790

Closed ixxmu closed 7 months ago

ixxmu commented 7 months ago

https://mp.weixin.qq.com/s/DKeXXAweil_dd3kwG8zIBw

ixxmu commented 7 months ago

跟着Nature Genetics用ggplot2画一张经典款分组柱状图,长宽数据转换 by 生信七点半

Reference

A quantitative genomics map of rice providesgenetic insights and guides breeding

https://doi.org/10.1038/s41588-020-00769-9

宽长数据转换

宽长数据转换,经常用到这里稍作简介。

在R语言中,可以使用tidyr包中的gather()函数将宽数据转换为长数据。以下是一个示例:

假设有以下的宽数据:

data_wide <- data.frame(
  ID = c(123),
  Age_0 = c(253028),
  Age_1 = c(263129),
  Age_2 = c(273230)
)

可以使用gather()函数将它转换为长数据:

library(tidyr)

data_long <- gather(data_wide, key = "Age_Category", value = "Age", -ID)

在这个示例中,key参数指定了新的列名,用于存储原始列的名称,而value参数指定了新的列名,用于存储原始列的值。-ID表示不包括ID列在内进行转换。

现在,data_long包含了转换后的长数据。结果如下:

  ID Age_Category Age
1  1        Age_0  25
2  2        Age_0  30
3  3        Age_0  28
4  1        Age_1  26
5  2        Age_1  31
6  3        Age_1  29
7  1        Age_2  27
8  2        Age_2  32
9  3        Age_2  30

这样,宽数据就被转换成了长数据。可以根据实际情况修改列名和数据框的名称。

使用tidyr包中的spread()函数将长数据转换为宽数据。以下是一个示例:

假设你有以下的长数据:

data_long <- data.frame(
  ID = c(1122),
  Variable = c("A""B""A""B"),
  Value = c(10203040)
)

可以使用spread()函数将它转换为宽数据:

library(tidyr)

data_wide <- spread(data_long, key = Variable, value = Value)

在这个示例中,key参数指定了原始数据中的列名,用于创建新的列,而value参数指定了原始数据中的值列,用于填充新的列。spread()函数会自动创建新的列,并将相应的值填充到这些列中。

现在,data_wide包含了转换后的宽数据。结果如下:

  ID  A  B
1  1 10 20
2  2 30 40

数据格式

# 数据因子化 调整顺序 
tbl$class<-factor(tbl$class,
                  levels = c('Lily'  ,  'Luck'  ,  'Blessing'   , 'Charm'  , 'Happiness' ,  'Magic'))

tbl$group<-factor(tbl$group,
                  levels = c("Northeast",
                             "East",
                             "Southeast"))

这段代码是对数据框(或表格)中的两列进行因子化操作,并调整它们的顺序。

  1. tbl数据框中的class列进行因子化操作:

  • 使用factor()函数将class列转换为因子型变量。
  • levels参数指定了因子水平的顺序,即类别的顺序。
  • 类别的顺序被设置为'Lily''Luck''Blessing''Charm''Happiness''Magic'
  • tbl数据框中的group列进行因子化操作:

    • 使用factor()函数将group列转换为因子型变量。
    • levels参数指定了因子水平的顺序,即分组的顺序。
    • 分组的顺序被设置为"Northeast""East""Southeast"

    通过这些操作,class列和group列都被转换为了因子型变量,并且它们的水平顺序被设置为指定的顺序。这可以用于控制在绘制图表或进行分析时类别或分组的顺序。

    柱状图

    毛坯

    ggplot(data=tbl,aes(x=class,y=DEGNumber))+
      geom_col(aes(fill=group),
               position = position_dodge(0.3),
               width = 0.3,
               show.legend = T)

    简装

    ggplot(data=tbl,aes(x=class,y=DEGNumber))+
      geom_col(aes(fill=group),
               position = position_dodge(0.3),
               width = 0.3,
               show.legend = T)+
      labs(x="",
           y="DEGNumber")+
      scale_fill_manual(values = c("#00C5FF",
                                   "#E6E600",
                                   "#73B273"))+
      coord_cartesian(ylim=c(-0.05,13000))+
      scale_y_continuous(expand = c(00))+
      theme_classic()+
      theme(legend.direction = "horizontal",
            legend.position = c(0.750.9),
            legend.title = element_text(colour = "white")
            
      )

    精装

    ggplot(data=tbl,aes(x=class,y=DEGNumber))+
      geom_col(aes(fill=group),
               position = position_dodge(0.3),
               width = 0.3,
               show.legend = T)+
      labs(x="",
           y="DEGNumber")+
      scale_fill_manual(values = c("#00C5FF",
                                   "#E6E600",
                                   "#73B273"))+
      coord_cartesian(ylim=c(-0.05,13000))+
      scale_y_continuous(expand = c(00))+
      theme_classic()+
      theme(legend.direction = "horizontal",
            legend.position = c(0.70.9),
            legend.title = element_text(size=0),
            text = element_text(family = 'serif')
      )

    新罗马一用就感觉贼高级

    注释

    1. ggplot(data=tbl,aes(x=class,y=DEGNumber)):这是创建ggplot2图形对象的开始。data参数指定数据框为tblaes()函数定义了图形的映射关系,x=class表示将class列用作x轴,y=DEGNumber表示将DEGNumber列用作y轴。

    2. geom_col(aes(fill=group), position = position_dodge(0.3), width = 0.3, show.legend = T):这是添加柱状图层。geom_col()函数用于创建柱状图,aes(fill=group)表示根据group列的不同取值进行填充颜色,position = position_dodge(0.3)表示将柱子进行分组,width = 0.3表示柱子的宽度,show.legend = T表示显示图例。

    3. labs(x="", y="DEGNumber"):这里设置了x轴和y轴的标签,将x轴标签设置为空字符串,y轴标签设置为"DEGNumber"。

    4. scale_fill_manual(values = c("#00C5FF", "#E6E600", "#73B273")):使用scale_fill_manual()函数手动设置填充颜色的映射关系,指定了三种颜色:蓝色(#00C5FF)、黄色(#E6E600)和绿色(#73B273),分别对应不同的group值。

    5. coord_cartesian(ylim=c(-0.05,13000)):使用coord_cartesian()函数设置y轴的坐标范围,限定y轴的范围在-0.05到13000之间。

    6. scale_y_continuous(expand = c(0, 0)):使用scale_y_continuous()函数设置y轴的连续刻度,expand = c(0, 0)表示不要扩展刻度。

    7. theme_classic():使用theme_classic()函数设置图表的基本主题风格。

    8. theme(legend.direction = "horizontal", legend.position = c(0.75, 0.9), legend.title = element_text(colour = "white"), text = element_text(family = 'serif')):设置图表的主题选项。其中:

    • legend.direction = "horizontal"设置图例的方向为水平。
    • legend.position = c(0.75, 0.9)设置图例的位置在图表的右上角。
    • legend.title = element_text(colour = "white")设置图例标题的颜色为白色。
    • text = element_text(family = 'serif')设置图表中的文本字体为serif字体。

    目的是创建一个带有分组柱状图的ggplot2图形,其中包含了各种视觉和主题设置,以定制和美化图表。可以根据需要进一步调整这些设置以满足特定的图表需求。

    下期实现分面绘图,搞成文献那样的组合图,legend还要单独放一块。