简体   繁体   中英

Use circos function in circos

Can someone help me? How can I add my circos function in my data? when i try i get an error message and it doesn't produce any results I want to do a donut figure like the representation number 1 but i have one other resultat that we can see in the other picture.Trying to follow this guide

所需图像

My data is lile this:

        Name;Integrons_1;Integrons_2;Integrons_3;TEM;SHV;CTX_M;NDM;OXA_48
        HZ1410;1;0;0;1;1;0;1;1
        HZ0411;1;0;0;1;0;0;0;1
        WI1410;1;0;0;1;1;0;0;1
        WI0411;1;0;0;1;0;0;1;0
        FR1410;1;0;0;1;0;0;0;0
        FR0411;0;0;0;1;1;0;0;0
        CN1410;1;0;0;1;1;0;1;0
        CN0411;1;0;0;1;0;0;0;1
        SA0912;0;0;0;0;0;0;0;0
        SA0302;1;0;0;1;0;0;0;0
        BL0912;1;0;0;1;1;0;0;0
        BL0302;1;0;0;1;1;1;0;1
        CSI0912;1;1;0;1;0;0;0;1
        CSI0302;1;0;0;1;1;1;1;1
        CSII0912;1;1;0;1;0;1;1;0
        CSII0302;1;0;0;1;0;0;0;0
        BGI0503;1;1;1;1;1;0;0;0
        BGI0610;1;0;0;1;1;0;0;0
        BGII0503;1;1;1;1;1;0;0;0
        BGII0610;1;0;1;1;1;0;0;0
        BCI0503;1;0;1;1;1;0;1;1
        BCI0610;1;0;1;1;0;0;0;0
        BCII0503;1;0;1;1;1;0;1;0
        BCII0610;1;0;1;1;0;0;0;0
        BDI0503;1;0;0;1;1;0;0;0
        BDI0610;1;1;1;1;1;1;1;0
        BDII0503;1;0;1;1;0;1;0;0
        BDII0610;1;1;1;1;1;1;0;1
        YPI0503;1;0;1;1;0;0;0;0
        YPI0710;1;1;1;1;1;1;0;1
        YPII0503;1;0;1;1;0;0;0;1
        YPII0710;1;1;1;1;1;1;0;0
        YMI0503;1;1;1;1;1;0;1;0
        YMI0710;1;1;1;1;1;1;1;1
        YMII0503;1;1;1;1;1;0;0;1
        YMII0710;1;1;1;1;1;1;1;1
        YSI0503;1;1;0;0;1;0;0;0
        YSI0710;1;1;1;1;1;1;1;1
        YSII0503;1;1;0;1;1;0;0;0
        YSII0710;0;1;1;1;1;0;0;0

And my code is represented here:

    #### IMPORT DES DONNEES ####
    nba = read.csv("essai_r.csv", sep=";", header=T)
    #attention : toujours utilise le format csv avec le sep = ";" pour avoir de 
    #beaux tableaux 


    #### INSTALLATION DES LIBRARY ####
    library(reshape)
    library(ggplot2)
    library(plyr)
    library(circlize)


    #### CREATION DES TABLEAUX : FCT MELT ####
    nba$Name <- with(nba, reorder(Name, GES))
    nba.m <- melt(nba)
    #pas utilise car ce n'est pas ce que je veux 
      #nba.m <- ddply(nba.m, .(variable), transform, value = scale(value))

    #### MODIFICATION DES DONNEES : FACTOR -> NUMERIQUES #### 
    # Convert the factor levels to numeric + quanity to determine size of hole.
    nba.m$var2 = as.numeric(nba.m$variable) + 15

    # Labels and breaks need to be added with scale_y_discrete.
    y_labels = levels(nba.m$variable)
    y_breaks = seq_along(y_labels) + 15


    #### CREATION DE LA HEATMAP (DEGRADE DE COULEUR UNIQUEMENT) ####
    p2 = ggplot(nba.m, aes(x=Name, y=var2, fill=value)) +
      geom_tile(colour="black") +
      scale_fill_gradient(low = "beige", high = "red") +
      ylim(c(0, max(nba.m$var2) + 0.5)) 
      scale_y_discrete(breaks=y_breaks, labels=y_labels) +
      coord_polar(theta="x") +
      theme(panel.background=element_blank(),
            axis.title=element_blank(),
            panel.grid=element_blank(),
            axis.text.x=element_blank(),
            axis.ticks=element_blank(),
            axis.text.y=element_text(size=5))

    ggsave(filename="plot_2.png", plot=p2, height=7, width=7)
    #sauvegarde le fichier dans le dossier 
    circos.par(start.degree = 90, gap.degree = 10)

    #### CREATION DE LA HEATMAP BIS (AVEC NOMS DE SITES )
    nba.labs <- subset(nba.m, variable==levels(nba.m$variable)[nlevels(nba.m$variable)])
    nba.labs <- nba.labs[order(nba.labs$Name),]
    nba.labs$ang <- seq(from=(360/nrow(nba.labs))/1.5, to=(1.5*(360/nrow(nba.labs)))-360, length.out=nrow(nba.labs))+80


    nba.labs$hjust <- 0
    nba.labs$hjust[which(nba.labs$ang < -90)] <- 1

    p3 = ggplot(nba.m, aes(x=Name, y=var2, fill=value)) +
      geom_tile(colour="black") +
      geom_text(data=nba.labs, aes(x=Name, y=var2+1.5,
                                   label=Name, angle=ang, hjust=hjust), size=3) +
      scale_fill_gradient(low = "beige", high = "steelblue") +
      ylim(c(0, max(nba.m$var2) + 1.5)) +
      scale_y_discrete(breaks=y_breaks, labels=y_labels) +
      coord_polar(theta="x") +
      theme(panel.background=element_blank(),
            axis.title=element_blank(),
            panel.grid=element_blank(),
            axis.text.x=element_blank(),
            axis.ticks=element_blank(),
            axis.text.y=element_text(size=5))
    nba.labs$ang[which(nba.labs$ang < -90)] <- (180+nba.labs$ang)[which(nba.labs$ang < -90)]

    #### Representation graphique ####
    p3

Your example data is significantly different to the "nba" examples you have used in this and previous questions. This is why you are having so much trouble. Here are three ways to visualize your actual data:

1.) Tidyverse geom_tile() method:

library(tidyverse)
#install.packages("vroom")
library(vroom)
#install.packages("ggrepel")
library(ggrepel)

df <- vroom(file = "example.txt")

df %>% 
  pivot_longer(cols = -c(Name), names_to = "category") %>% 
  ggplot(aes(x = Name, y = category, fill = value)) +
  geom_tile(colour = "white") +
  geom_text(aes(label = ifelse(Name == "BCI0503", category, "")),
            nudge_x = -0.5) +
  geom_text_repel(aes(label = ifelse(category == "TEM", Name, "")),
                  nudge_y = 2) +
  scale_fill_gradient(low = "beige", high = "red", breaks = c(0, 1)) +
  coord_polar(theta="x") +
  theme_void()

示例_1.png

This doesn't look great - you can make a "hole" in the middle, but I don't think that this type of plot is going to suit your data.

2.) Circlize circos plot

#install.packages("circlize")
library(circlize)

mat = data.matrix(df)[,2:9]
rownames(mat) <- df$Name
col_fun1 = colorRamp2(c(0, 1), c("beige", "red"))
circos.par(gap.after = c(20))
circos.heatmap(mat, col = col_fun1,
               rownames.side = "outside",
               track.height = 0.4)
circos.track(track.index = get.current.track.index(),
             panel.fun = function(x, y) {
  if(CELL_META$sector.numeric.index == 1) { # the last sector
    cn = colnames(mat)
    n = length(cn)
    circos.text(rep(CELL_META$cell.xlim[2], n) + convert_x(1, "mm"), 
                1:n - 0.5, cn, 
                cex = 0.5, adj = c(0, 0.5), facing = "inside")
  }
}, bg.border = NA)

示例_2.png

This is better, but still not great. I believe the issue is that your "counts" are either 0 or 1 - I think another method is better suited to this type of data: UpSetR plots

3.) UpSetR plot

#install.packages("UpSetR")
library(UpSetR)

df_int <- df %>% 
  mutate(across(c(2:9), as.integer)) %>% 
  as.data.frame()

upset(df_int, order.by = "freq", sets.bar.color = "#56B4E9")

示例_3.png

This is how I would visualize this type of data, but obviously it's up to you how you ultimately want to portray it.

If you had included a sample of your actual data in your original question this answer would have taken ~10 mins instead of an hour. Please, in future questions, ensure your example dataset accurately matches your actual data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM