【问题标题】:Improve readability of barplot提高条形图的可读性
【发布时间】:2020-06-25 22:18:26
【问题描述】:

这是我的数据:

dput(DATA)
structure(c(-0.01728, 0.00072, -0.02452, -0.02589, -0.00376, 
            -0.05394, -0.07508, -0.00671, -0.10151, -0.05788, -0.09119, -0.07414, 
            -0.08645, -0.00465, -0.04487, -0.02463, -0.06887, -0.0426, -0.03045, 
            -0.00063, -0.00097, -0.04478, 0.00311, 40.112684060182, 962.704417444368, 
            28.2686452104382, 26.7727763831574, 184.347654404241, 12.8503370515377, 
            9.23211481832639, 103.300623034269, 6.8283635165003, 11.9755905418097, 
            7.60113148985574, 9.34916617965937, 8.0178968254476, 149.063909797838, 
            15.4478979398249, 28.1423946634164, 10.0645735524894, 16.2710605765245, 
            22.7634542055811, 1100.23361993642, 714.584722226748, 15.4789455238934, 
            222.876906932458, 43.2, 1.8, 61.3, 64.725, 9.4, 134.85, 187.7, 
            16.775, 253.775, 144.7, 227.975, 185.35, 216.125, 11.625, 112.175, 
            61.575, 172.175, 106.5, 76.125, 1.575, 2.425, 111.95, 7.775), .Dim = c(23L, 
                                                                                   3L), .Dimnames = list(c("1", "2", "3", "4", 
                                                                                                           "5", "6", "7", "8", "9", "10", 
                                                                                                           "11", "12", "13", "14", "15", "16", 
                                                                                                           "17", "18", "19", "20", "21", "22", 
                                                                                                           "23"), c("SAD", "T", "CC")))

这是我用于绘图的代码:

xx <- barplot(abs(DATA[, "CC"]), ylab="CC", ylim=c(0,20+max(abs(DATA[, "CC"]))),las=2, space = 1, width = 2, cex.names = 0.75, cex.axis = 0.5, cex=0.5)
    text(x = xx, y = signif(abs(DATA[, "CC"]), digits=2), label = signif(abs(DATA[, "CC"]), digits=2), pos = 3, cex = 0.75, col = "black")

这就是情节的样子:

所以我使用这段代码来绘制我的数据。问题是柱的数量通常不同。有时可能只有 5 个酒吧,而其他一天则超过 30 个。

有没有办法让这个条形图更具可读性? 有没有办法根据要绘制的变量数量来查看图表。只是为了确保每次都可读?

【问题讨论】:

  • 建议:(1)旋转数字,防止重叠。 (2) 可选择切换到ggplot2,并使用ggrepel 包确保没有文本标签重叠。

标签: r


【解决方案1】:

更新见下文

我喜欢@IanCambell 旋转图表的想法。 +1。您可以从基础 R 图中得到它,只需稍作改动即可。

xx <- barplot(abs(DATA[, "CC"]), ylab="CC", xlim=c(0,20+max(abs(DATA[, "CC"]))),
    las=2, space = 1, width = 2, cex.names = 0.75, cex.axis = 0.5, cex=0.5, horiz=T)
text(y = xx, x = signif(abs(DATA[, "CC"]), digits=2), 
label = signif(abs(DATA[, "CC"]), digits=2), pos = 4, cex = 0.75, col = "black")

更新基于 OP 的评论

如果要显示的标签太长,则需要调整才能显示。例如,更改原始问题的标签并插入上面的代码会产生不好的结果。

当然,您可以通过增加 xlim 来解决这个问题,但这也会在 x 轴上包含一些额外的不需要的值。因此,另一种解决方案是允许文本超出绘图区域(将 xpd=NA 添加到 text 语句中)并增加边距以便为标签留出足够的空间。

par(mar=c(5,4,4,10))
xx <- barplot(abs(DATA[, "CC"]), ylab="CC", xlim=c(0,20+max(abs(DATA[, "CC"]))),
     las=2, space = 1, width = 2, cex.names = 0.75, cex.axis = 0.5, cex=0.5, horiz=T)
text(y = xx, x = signif(abs(DATA[, "CC"]), digits=3), xpd=NA,
    label = labels, pos = 4, cex = 0.75, col = "black")

【讨论】:

  • 这看起来不错,但我故意避免旋转图形,因为条形图的名称可能很长,在这种情况下没有足够的空间。我只是将真实姓名更改为随机数字。有没有办法给标签留出更多空间?
  • 是的,添加到答案中。
【解决方案2】:

涉及ggrepel::geom_text_repel 的解决方案被证明非常具有挑战性。也许这无论如何都会有所帮助:

library(ggplot2)
ggplot(data = as.data.frame(DATA), aes(x = as.factor(seq_along(CC)),  y = CC)) +
  geom_bar(stat = "identity") + 
  geom_text(aes(label = signif(CC,2)), hjust = -0.2) +
  coord_flip() + 
  scale_y_continuous(expand = expansion(mult = c(0,0.05))) +
  theme_classic() + theme(axis.title.y = element_blank())

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 2010-09-08
    • 2019-09-13
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多