当前位置:  开发笔记 > 编程语言 > 正文

ggplot条形图中的中心文本图层

如何解决《ggplot条形图中的中心文本图层》经验,为你挑选了1个好方法。

我有一些带有一些文字的直方图,我试图将它作为相应类型的中心

df = read.table(text = "
id   year  type amount
                1  1991  HIIT     22
                2  1991 inter    144
                3  1991  VIIT     98
                4  1992  HIIT     20
                5  1992 inter    136
                6  1992  VIIT    108
                7  1993  HIIT     20
                8  1993 inter    120
                9  1993  VIIT    124
                10 1994  HIIT     26
                11 1994 inter    118
                12 1994  VIIT    120
                13 1995  HIIT     23
                14 1995 inter    101
                15 1995  VIIT    140
                16 1996  HIIT     27
                17 1996 inter    103
                18 1996  VIIT    162
                19 1997  HIIT     24
                20 1997 inter     96
                21 1997  VIIT    172
                22 1998  HIIT     24
                23 1998 inter     92
                24 1998  VIIT    177
                25 1999  HIIT     28
                26 1999 inter     45
                27 1999  VIIT    220
                28 2000  HIIT     26
                29 2000 inter     36
                30 2000  VIIT    231", header = TRUE, sep = "")
library(dplyr);
library(ggplot2);
library(scales);

df %>%
  mutate(type = factor(type, levels = c("inter",  "VIIT", "HIIT"))) %>%
  group_by(year) %>%
  mutate(ratio = amount/sum(amount),
         pos=cumsum(ratio)-ratio/2) %>%
  ggplot(aes(x=factor(year), y=ratio, fill=type)) +
  geom_bar(stat="identity") +
  geom_text(aes(y = pos, label = percent(pos)), size = 4) +
  scale_y_continuous(name="", labels = percent) +
  coord_flip()

我的情节看起来像: 在此输入图像描述

你能帮我解决这个问题,因为我不知道怎么用position参数修复它

谢谢



1> Peter Ellis..:

我不确定你想要做什么,但假设你想要在栏的每个彩色片段中间的文字到

    在酒吧的中心; 和

    是一个有意义的数字显示酒吧的大小

要解决第一个问题,您需要type在计算pos值via 之前对数据进行排序cumsum.

要修复第二个,你应该ratio向标签美学展示,而不是pos,除了作为放置标签的水平坐标之外,这不是一个有意义的数字.

df %>%
  mutate(type = factor(type, levels = c("inter",  "VIIT", "HIIT"))) %>%
  group_by(year) %>%
  arrange(desc(type)) %>%
  mutate(ratio = amount / sum(amount),
         pos = cumsum(ratio) - ratio / 2) %>%
  ggplot(aes(x = factor(year), y = ratio, fill = type)) +
  geom_bar(stat = "identity") +
  geom_text(aes(y = pos, label = percent(ratio)), size = 4) +
  scale_y_continuous(name="", labels = percent) +
  coord_flip()

在此输入图像描述

顺便说一句,这不是直方图,而是堆积的条形图.一个直方图是完全不同的东西.

编辑 - 替代,更简单的方法

正如评论中指出的那样,最近添加到ggplot2中position_stack,将为您计算位置,而不是pos在数据管道中创建变量.所以下面的代码可能是做整件事的一种更简洁的方法(给出相同的结果):

df %>%
  group_by(year) %>%
  mutate(type = factor(type, levels = c("inter",  "VIIT", "HIIT"))) %>%
  mutate(ratio = amount / sum(amount)) %>%
  ggplot(aes(x = factor(year), y = ratio, fill = type)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = percent(ratio)), position = position_stack(vjust = 0.5), size = 4) +
  scale_y_continuous(name="", labels = percent) +
  coord_flip()


@PeterEllis如果我不改变任何东西,除了在`geom_text()中引入`position = position_stack(vjust = 0.5)`之外,我得到的答案与你的答案相同.
@Sathish你是对的,`position_stack`是一种更简单的方法; 我已经添加它作为我的答案的替代.
推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有