使用ggplot时,我在格式化的两个方面遇到了一些困难。
首先,我希望能够为每个条形添加水平线条,以便条形图如下所示:
img http://www.eurosurveillance.org/images/dynamic/ew/v05n47/Legionella%20Norway%20epi%20curve.gif
第二,我想更改刻度标签的位置,使它们落在每个条之间,以便标签看起来像这样
到目前为止我所拥有的:
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)
答案 0 :(得分:6)
很好的描述和可重复的例子!
如果x轴是一个因子,则以条形为中心的轴标签是默认值。由于您知道自己的binwidth,因此只需使用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"
要获取框(所有这些水平线),您可以使用分组变量(我们需要先重新排序)。不能说我喜欢这个样子,但现在是:
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)