barplot - 在不操纵伴随条的情况下对x轴标签进行分组

时间:2017-04-29 10:21:45

标签: r data-analysis

我正在对此数据集进行一些基本数据分析:https://www.kaggle.com/murderaccountability/homicide-reports

我使用状态名称作为x轴值生成基本条形图,y轴值是全国范围内杀人事件发生的百分比(数据集中的条目数除以总数)条目)

barplot(prop.table(table(homicideData.raw$State)),
    main = "Nationwide Homicide % per State",
    ylab = "Accounting % of Nation-wide Homicides",
    las=2)

enter image description here

这非常混乱,有没有一种方法可以将5个状态组合在一起作为x轴标签,而不更改条形图?

让我们举例说明以下内容:

x轴标签:"阿拉斯加 - 加利福尼亚","科罗拉多 - 佛罗里达",......(等等)。然后每个标签上面应该有5个条。

1 个答案:

答案 0 :(得分:2)

这是ggplot的解决方案。它并不是最简单的,因为它涉及一些数据操作。

(1)读入数据集并按州提取凶杀案数量/比例:

df <- read.csv("homicide.csv")

library(dplyr)
freq <- with(df, table(State)) %>% data.frame
freq <- freq %>% mutate(prop = Freq/sum(Freq))

(2)找到每组5个州的第一个和最后一个元素:

hd <- seq(1, nrow(freq), by=5) %>% ceiling
hd <- hd[-length(hd)]
td <- c((hd-1)[-1], nrow(freq)) 

(3)自定义功能,为每个组制作自定义标签(例如Alb - Clf)并计算每组的长度

abbrevFn <- function(head, tail, state, ...) paste(abbreviate(state[c(head,tail)], ...), collapse = " - ")

intervalFn <- function(head, tail) diff(c(head, tail)) + 1

(4)通过按每个组的长度复制自定义标签来对状态进行分组

freq$group <- lapply(1:length(hd), function(x) rep(abbrevFn(hd[x], td[x], freq$State, min=3), intervalFn(hd[x], td[x]))) %>% unlist

(5)根据自定义组绘制geom_bar,按状态绘制闪避位置:

xint <- c((1:length(hd) - .5), (1:length(hd) + .5)) %>% unique

library(ggplot2)
ggplot(freq, aes(group, prop, fill=State)) + 
  geom_bar(stat="identity", position="dodge", width=1) + 
  scale_fill_manual(values=rep("gray80", nrow(freq))) +
  ylab("Accounting % of Nation-wide Homicides") +
  xlab("States") +
  geom_vline(xintercept=xint, linetype="dotted") +
  guides(fill=FALSE) +
  theme_bw()

enter image description here