r - ggplot : Adding horizontal lines to each bar + repositioning tick labels

标签 r ggplot2

在使用 ggplot 时,我在格式化的两个方面遇到了一些困难。

首先,我希望能够为每个条形添加水平线,以便条形看起来像这样:

img
(来源:eurosurveillance.org)

第二,我想更改刻度标签的位置,使它们落在每个条形之间,使标签看起来像这样

img

我目前拥有的:

values=runif(50,0,20)
sex=rep(c("Male","Female"),25)

df=data.frame(values,sex)

label=c("","0-5","5-10","10-15","15-20")
sep=seq(0,20,5)

ggplot(df, aes(x = values,fill=sex))+geom_bar(binwidth=5,colour="black")+
scale_x_discrete(breaks=sep,labels=label,limits=sep)

最佳答案

很好的描述和可重现的例子!

如果您的 x 轴是一个因素,则以条为中心的轴标签是默认值。由于您知道您的 binwidths,只需使用 cut 为您进行分箱:

df$cutval <- cut(values, breaks = seq(0, 20, by = 5))
ggplot(df, aes(x = cutval, fill = sex)) +
    geom_bar(colour = "black", width = 1)

要获得与示例中完全相同的标签,您可以进行一些正则表达式编辑:

library(stringr)
# delete open parens and closing brackets
levels(df$cutval) <- str_replace_all(levels(df$cutval), "\\(|\\]", "")
# replace comma with tilde
levels(df$cutval) <- str_replace_all(levels(df$cutval), "\\,", "~")

屈服

> levels(df$cutval)
[1] "0~5"   "5~10"  "10~15" "15~20"

enter image description here

要获取框(所有那些水平线),您可以使用分组变量(我们需要先重新排序)。不能说我喜欢它的外观,但它就是这样:

df <- df[order(df$cutval, df$sex), ]
df$id <- 1:nrow(df)
ggplot(df, aes(x = cutval, fill=sex, group = id)) +
    geom_bar(colour = "black", width = 1)

enter image description here

关于r - ggplot : Adding horizontal lines to each bar + repositioning tick labels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087056/

相关文章:

r - `geom_abline` 和 `facet_wrap` 似乎不兼容

r - 强制单独 y 轴限制

R | ggplot2 | (删除刻度线 + 删除面板边框)但保留轴线

r - 图形错误 : Don't know how to automatically pick scale

r - 查找大于 0 的最小值

r - 根据因子值的ggplot中的背景颜色矩形

r - 在分组条形图中显示单个条形计数标签

r - 绘图到R中的文件

r - ggplot 函数内 aes(...) 中变量的范围

r - 使用 here() 函数上一级根目录