仅在绘制条形图时在条形图中显示班级计数

时间:2018-07-04 13:23:53

标签: r ggplot2 data-visualization

我想在geom_bar输出中显示每个栏的实例数。更具体地说,如果一个条形图未显示(因为其值= 0),则也不应绘制实例数。使用geom_text()无法完成工作,至少不能用我的代码行完成。请注意,在这种情况下,堆叠条形图的帖子不适用。

以下是一些数据:

df <- data.frame(classes = rep(c("Class_A","Class_B","Class_C","Class_D"),
                               each=3),
                 clusters = rep(1:3),
                 score_1 = sample(0:4,4, replace = F), 
                 score_2 = sample(0:4,4, replace = F), 
                 score_3 = sample(0:4,4, replace = F), 
                 count = sample(1:200, 12,replace = T))

这是我到目前为止一直在使用的一些代码

ggplot(df, aes(classes, score_1)) +
  geom_bar(stat = "identity", position =  position_dodge(width = 0.4), 
           aes(fill = clusters)) +
  labs(title = "Median per cluster of Score_1",
       x="some text", y=element_blank()) +
  theme_bw() + theme(text = element_text(size=10),
                     axis.text.x = element_text(angle=90, hjust=1)) +
  geom_text(aes(label = count))

这是LHS上的输出,而我想要的结果应该看起来像RHS。我不在乎文本是在条中还是在条之上。

LHS: Current output. RHS: Desired output.

答案

作为最终结果,在Grant的帮助下,这是最终结果:

ggplot(df, aes(classes, score_1)) +
  geom_bar(stat = "identity", position =  position_dodge(width = 0.4), 
           aes(fill = clusters)) +
  geom_text(aes(label = count2, group = clusters), position = position_dodge(width = 0.4), 
       vjust = -.08, hjust = 0.6, size = 3) +
  labs(title = "Median per cluster of Score_1",
       x="some text", y=element_blank()) +
  theme_bw() + theme(text = element_text(size=10),
       axis.text.x = element_text(angle=90, hjust=1))

通过添加group = clusters,可以使用hjustvjust更有效地操纵位置。

1 个答案:

答案 0 :(得分:1)

要不显示高度为0的钢筋的计数,可以在score_1变量为0的情况下新建一个空白列,并将其显示在图形中。

df$count2 = ifelse(df$score_1 != 0, df$count, "")

要使文本更靠近条形,可以使用与position(在本例中为geom_text())中使用的geom_bar()相同的position_dodge(width = 0.4)参数。将vjust设置为2也会使其向下移动一点。

这是我的图形代码:

ggplot(df, aes(classes, score_1)) + 
    geom_bar(stat = "identity", position = position_dodge(width = 0.4), aes(fill = factor(clusters))) + 
    geom_text(aes(label = count2), position = position_dodge2(0.4), vjust = 2) + 
    labs(title = "Median per cluster of Score_1", x="some text", y=element_blank()) + 
    theme_bw() + 
    theme(text = element_text(size=10), axis.text.x = element_text(angle=90, hjust=1)) 

在添加将其更改为fill = factor(clusters)之前,我还有一点不同的输出。

以下是该图的链接(使用略有不同的数据): Graph that omits labels when y = 0 and positions text with the bars.