并排堆放的条形图,但没有刻面

时间:2018-01-03 04:13:26

标签: r ggplot2

我正在跟进此示例中的问题和问题:

R stacked barchart with aggregate data

回顾一下,这是原始问题和相当优雅的解决方案。

D <- as.data.frame(structure(list(Group = c("A", "A", "A", "A", "A", 
"A", "B", "B", "B", "B", "B", "B"
), Education = c("NVQ Level 4 and above", "NVQ Level3", "NVQ Level 2", 
"Below NVQ Level 2", "Other qualification", "No qualification", 
"NVQ Level 4 and above", "NVQ Level3", "NVQ Level 2", "Below NVQ Level 2", 
"Other qualification", "No qualification"), Full.Time = c(47, 
27, 23, 17, 18, 9, 36, 26, 22, 22, 27, 12), PT.16.hours = c(20, 
24, 22, 18, 18, 12, 22, 21, 21, 22, 14, 10), PT.16.hours.1 = c(12, 
11, 10, 11, 13, 5, 24, 25, 25, 20, 16, 12)), .Names = c("Group", 
"Education", "Full.Time", "PT>16.hours", "PT<16.hours")))

解决方案是绘制一个堆叠的条形图,其中两种类型的教育(作为方面)如下:

library(reshape2)
library(ggplot2)

df <- melt(D)

ggplot(df, aes(x = Education, y = value, fill = variable)) +
geom_bar(stat = "identity") + 
facet_wrap(~ Group)

enter image description here

然而,这导致了一个分面的情况。我想知道我如何能够与两个条形图并排,但没有分面,而是一个跨越六个教育栏目的总体标签与团体标签(在这种情况下为A或B)。

我可以做以下事情:

df <- data.frame(df, groupsandeducation = interaction(df$Group, df$Education))

ggplot(df, aes(x = groupsandeducation, y = value, fill = variable)) +
geom_bar(stat = "identity") + 
ylab('') +
xlab('') + 
labs(title = '') +
scale_fill_discrete('') +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

这给了我下图: enter image description here

这让我成为了我的一部分。但是,我想再发生以下情况。

  1. 在两组条形图之间可能有半条宽度的空间。
  2. x轴标记上的标签应该有A.和B.剥离。
  3. 我希望A能够扩展前六个柱,而B想要跨越x轴上的最后六个柱。
  4. 我想把它全部放在一个图中,因此不希望有一个方面。 怎么做到这一点?

    [更新解决方案:]谢谢,这是我的解决方案。

    out <- melt(D) %>%
        arrange(Group, Education) %>%
        mutate(position = rep(c(seq(from = 0.8, by = 0.4, length = 6), 0.8 + 0.4*5-0.2 + seq(from = 0.8, by = 0.4, length = 6)),
               each = 3))
    
    ggplot(out, aes(x = position, y = value, fill = variable)) +  
    geom_bar(stat = "identity", size = 0.5) +
    scale_x_continuous(name = "Group", breaks = c(1.8, 4.4), labels = unique(out$Group)) + ylim(c(-20,100)) +
    annotate(geom = "text", 
             x = unique(out$position), y = 0, 
             label = rep(as.character(out$Education[3*(1:6)]), times = 2), size = 3, angle = 90, hjust = 1)  + theme_light()
    

    这就是我得到的: enter image description here

    [更新:]我正在尝试使用coord_polar来重现圆形堆叠条形图,如本例所示。

    Polar Histogram

    代码位于github

    该函数对于我的实际问题来说太复杂了,并且没有解释它为什么在任何地方执行它所做的事情,因为它是由专家编写的未注释代码。

2 个答案:

答案 0 :(得分:1)

所有方面都在六个条中的每个条上放置一个标签,并在它们之间留出一些空格。所以我会使用facets。您可以根据需要更改外观,例如

df <- melt(D)

ggplot(df, aes(x = Education, y = value, fill = variable)) +
  geom_bar(stat = "identity") + 
  facet_wrap( ~ Group, strip.position = 'bottom') +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))

enter image description here

如果需要,您可以进行许多其他调整。

答案 1 :(得分:1)

这是我的尝试。我通过将x轴更改为数字来解决问题。我的诀窍是为条形指定x值,好像条形按enum Example { case one(string: String) case two(string: String) func cloneWith(string: String) -> Example { switch self { case .one: return .one(string: string) case .two: return .two(string: string) } } } let x = Example.one(string: "Hello") print(x) // Prints one("Hello") let y = x.cloneWith(string: "World") print(y) // Prints one("World") 的每个级别(例如EducationBelow NVQ Level 2No qualification)进行分组,然后躲过NVQ Level 2。我编写了以下代码,以便操纵数据来完成这项任务。

Group

然后,我为下面的图形编写了以下代码。我使用library(reshape2) library(dplyr) library(ggplot2) out <- melt(D) %>% arrange(Education, Group) %>% mutate(position = rep(c(0.8, 1.2, 1.8, 2.2, 2.8, 3.2, 3.8, 4.2, 4.8, 5.2, 5.8, 6.2), each = 3)) AB添加到图形中。

annotate()

enter image description here