水平geom_bar,无重叠,条宽相等,并且自定义了轴刻度标签

时间:2018-07-09 01:32:28

标签: r ggplot2 geom-bar

可能是一个简单的ggplot2问题。

我有一个data.frame,其值是numeric,分类(factor)值和character值:

library(dplyr)
set.seed(1)
df <- data.frame(log10.p.value=c(-2.5,-2.5,-2.5,-2.39,-2,-1.85,-1.6,-1.3,-1.3,-1),
                 direction=sample(c("up","down"),10,replace = T),
                 label=paste0("label",1:10),stringsAsFactors = F) %>% dplyr::arrange(log10.p.value)
df$direction <- factor(df$direction,levels=c("up","down"))

我想使用barplot将这些数据绘制为geom_bar,其中条形图是水平的,其长度由df$log10.p.value确定,其颜色由df$direction,以及y-axis tick标签为df$label,其中的条由df$log10.p.value垂直排序。

您可以看到df$log10.p.value不是唯一的,因此:

ggplot(df,aes(log10.p.value))+geom_bar(aes(fill=direction))+theme_minimal()+coord_flip()+ylab("log10(p-value)")+xlab("")

给我: enter image description here

我如何:

  1. 使条形不互相重叠。
  2. 具有相同的宽度。
  3. 相隔不远?
  4. y-axis tick标签是df$label吗?

谢谢

1 个答案:

答案 0 :(得分:1)

这是一种可能的解决方案。请注意,默认情况下,geom_bar使用频率/计数确定钢筋长度。因此,您需要为值映射指定stat = "identity"

# since all of your values are negative the graph is on the left side
ggplot(df, aes(x = label, y = log10.p.value, fill = direction)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  coord_flip() + 
  ylab("log10(p-value)") +
  xlab("")