我正在跟进此示例中的问题和问题:
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)
然而,这导致了一个分面的情况。我想知道我如何能够与两个条形图并排,但没有分面,而是一个跨越六个教育栏目的总体标签与团体标签(在这种情况下为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))
这让我成为了我的一部分。但是,我想再发生以下情况。
我想把它全部放在一个图中,因此不希望有一个方面。 怎么做到这一点?
[更新解决方案:]谢谢,这是我的解决方案。
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()
[更新:]我正在尝试使用coord_polar来重现圆形堆叠条形图,如本例所示。
代码位于github
该函数对于我的实际问题来说太复杂了,并且没有解释它为什么在任何地方执行它所做的事情,因为它是由专家编写的未注释代码。
答案 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))
如果需要,您可以进行许多其他调整。
答案 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")
的每个级别(例如Education
,Below NVQ Level 2
和No 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))
将A
和B
添加到图形中。
annotate()