条形图-轴刻度不会根据条形进行调整

时间:2019-07-11 08:13:27

标签: r ggplot2

我必须在R ggplot2中绘制一个条形图,其中每个组(即不同的人群,例如印度,韩国,菲律宾等)的多个变量(即,BMI,体重,胆固醇,血压等各个条形图)。条形图溢出到轴上的下一组。例如:印度集团的酒吧正泛滥到韩国集团。轴标记未相应调整。我已经附上了这个图..有人可以帮忙吗。以下是我的代码。还给出了dput(data)。

p = ggplot(data = t, 
           aes(x = factor(Population, levels = names(sort(table(Population), increasing = TRUE))),
               y = Snp_Count, 
               group = factor(Trait, levels = c("BMI", "DBP", "HDL", "Height", "LDL", "TC", "TG", "WC", "Weight"), 
                              ordered = TRUE)))

p = p + geom_bar(aes(fill = Trait), 
                 position = position_dodge(preserve = "single"), 
                 stat = "identity") + 
  scale_fill_manual(values = c("#28559A", "#3EB650", "#E56B1F", "#A51890", "#FCC133", "#663300", "#6666ff", "#ff3300", "#ff66ff")) + 
  coord_flip()
structure(list(Trait = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), .Label = c("BMI", 
"DBP", "HDL", "HT", "LDL", "TC", "TG", "WC", "Weight"), class = "factor"), 
    Association = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = "Direct", class = "factor"), TraitClass = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Anthropometric", 
    "BP", "Lipid"), class = "factor"), Population = structure(c(2L, 
    3L, 4L, 5L, 7L, 8L, 10L, 11L, 12L, 13L, 22L, 24L, 3L, 5L, 
    11L, 22L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
    14L, 15L, 18L, 20L, 28L, 5L, 7L, 13L, 14L, 1L, 3L, 5L, 7L, 
    9L, 11L, 12L, 16L, 18L, 20L, 22L, 5L, 6L, 7L, 10L, 12L, 18L, 
    20L, 3L, 5L, 6L, 7L, 8L, 11L, 12L, 13L, 14L, 15L, 18L, 19L, 
    20L, 21L, 22L, 23L, 26L, 28L, 3L, 4L, 5L, 8L, 12L, 22L, 24L, 
    3L, 5L, 7L, 8L, 17L, 25L, 27L), .Label = c("ACB", "AFR", 
    "ASW", "ASW/ACB", "CEU", "CHB", "EAS", "Filipino", "FIN", 
    "GBR", "Hispanic", "Hispanic/Latinos", "JPT", "Korean", "Kuwaiti", 
    "Micronesian", "Moroccan", "MXL", "Mylopotamos", "Orcadian", 
    "Pomak", "SAS", "Saudi_Arabian", "Seychellois", "Surinamese", 
    "Taiwanese", "Turkish", "YRI"), class = "factor"), Snp_Count = c(3L, 
    12L, 6L, 17L, 2L, 10L, 1L, 6L, 3L, 3L, 10L, 6L, 1L, 1L, 1L, 
    1L, 2L, 1L, 10L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 3L, 1L, 1L, 
    2L, 1L, 2L, 20L, 5L, 4L, 1L, 1L, 2L, 7L, 2L, 1L, 1L, 1L, 
    1L, 1L, 1L, 2L, 8L, 2L, 4L, 3L, 1L, 2L, 1L, 4L, 20L, 5L, 
    11L, 2L, 4L, 3L, 4L, 2L, 3L, 4L, 1L, 1L, 1L, 2L, 2L, 1L, 
    2L, 3L, 2L, 4L, 4L, 1L, 4L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L
    ), Gene_Count = c(3L, 9L, 7L, 9L, 2L, 8L, 1L, 7L, 3L, 2L, 
    8L, 7L, 1L, 1L, 1L, 1L, 2L, 1L, 4L, 1L, 1L, 1L, 1L, 2L, 2L, 
    1L, 2L, 1L, 1L, 1L, 1L, 1L, 9L, 6L, 5L, 1L, 1L, 2L, 5L, 2L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 6L, 2L, 3L, 3L, 1L, 2L, 1L, 3L, 
    10L, 4L, 7L, 1L, 3L, 3L, 4L, 1L, 3L, 5L, 1L, 1L, 1L, 3L, 
    3L, 1L, 1L, 2L, 2L, 3L, 3L, 1L, 3L, 2L, 3L, 3L, 2L, 3L, 2L, 
    2L, 2L)), class = "data.frame", row.names = c(NA, -86L))

this is the output with the above code

1 个答案:

答案 0 :(得分:1)

条形图中每个组的总宽度默认为0.9,这意味着90%的区域被覆盖。当您将单个条形的宽度增加到3时,它们将与其他组重叠,因此with的最大值应为1,然后它将触及其他组。

在您的情况下,我建议您使用facet_wrap而不是躲避的条形图。

注意:geom_colgeom_bar(stat = "identity)相同。

my.df$Trait <- factor(my.df$Trait, levels = c("BMI", "DBP", "HDL", "HT", "LDL", "TC", "TG", "WC", "Weight"))
my.df$Population <- factor(my.df$Population, levels = names(sort(table(my.df$Population), increasing = TRUE)))

ggplot(my.df, aes(x = Trait, y = Snp_Count, fill = Trait)) + 
  geom_col(width = 1) +
  scale_fill_manual(values = c("#28559A", "#3EB650", "#E56B1F", "#A51890", "#FCC133", "#663300", "#6666ff", "#ff3300", "#ff66ff")) + 
  # Split the data by Population, allow flexible scales and spacing for y axis (Trait)
  facet_grid(Population ~ ., scales = "free_y", space = "free_y", switch = "y") +
  coord_flip() +
  theme(axis.text.y = element_blank(), # Remove Trait labels (indicated by color)
        axis.ticks.y = element_blank(), # Remove tick marks
        strip.background = element_blank(), 
        strip.text.y = element_text(angle = 180, hjust = 1), # Rotate Population labels
        panel.spacing.y = unit(3, "pt")) # Spacing between groups

enter image description here

数据

my.df <- 
  structure(list(Trait = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                                     1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
                                     3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
                                     5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 
                                     7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
                                     7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L), 
                                   .Label = c("BMI", "DBP", "HDL", "HT", "LDL", "TC", "TG", "WC", "Weight"), class = "factor"), 
                 Population = structure(c(2L, 3L, 4L, 5L, 7L, 8L, 10L, 11L, 
                                          12L, 13L, 22L, 24L, 3L, 5L, 11L, 22L, 3L, 4L, 5L, 6L, 7L, 
                                          8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 18L, 20L, 28L, 5L, 
                                          7L, 13L, 14L, 1L, 3L, 5L, 7L, 9L, 11L, 12L, 16L, 18L, 20L, 
                                          22L, 5L, 6L, 7L, 10L, 12L, 18L, 20L, 3L, 5L, 6L, 7L, 8L, 
                                          11L, 12L, 13L, 14L, 15L, 18L, 19L, 20L, 21L, 22L, 23L, 26L, 
                                          28L, 3L, 4L, 5L, 8L, 12L, 22L, 24L, 3L, 5L, 7L, 8L, 17L, 
                                          25L, 27L), 
                                        .Label = c("ACB", "AFR", "ASW", "ASW/ACB", "CEU", 
                                                   "CHB", "EAS", "Filipino", "FIN", "GBR", "Hispanic", "Hispanic/Latinos", 
                                                   "JPT", "Korean", "Kuwaiti", "Micronesian", "Moroccan", "MXL", 
                                                   "Mylopotamos", "Orcadian", "Pomak", "SAS", "Saudi_Arabian", 
                                                   "Seychellois", "Surinamese", "Taiwanese", "Turkish", "YRI"), class = "factor"), 
                 Snp_Count = c(3L, 12L, 6L, 17L, 2L, 
                               10L, 1L, 6L, 3L, 3L, 10L, 6L, 1L, 1L, 1L, 1L, 2L, 1L, 10L, 
                               1L, 1L, 2L, 1L, 2L, 1L, 1L, 3L, 1L, 1L, 2L, 1L, 2L, 20L, 
                               5L, 4L, 1L, 1L, 2L, 7L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 8L, 
                               2L, 4L, 3L, 1L, 2L, 1L, 4L, 20L, 5L, 11L, 2L, 4L, 3L, 4L, 
                               2L, 3L, 4L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 3L, 2L, 4L, 4L, 1L, 
                               4L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L)), 
            class = "data.frame", row.names = c(NA, -86L))
相关问题