无法使用ggplot2在瀑布图中添加数据标签

时间:2018-03-30 09:14:41

标签: r ggplot2

我正在尝试使用ggplot2绘制瀑布图。当我放置数据标签时,它没有放在正确的位置。

以下是我正在使用的代码

final Map<String, Map<String, Set<String>>> exchanges = gson.fromJson(jsonReader, exchangesType);
System.out.println(exchanges);

以下是输出。我希望数据标签位于栏的开头或末尾。 我不是R的专家。只是想学习。任何帮助都会非常感激。

我正在关注以下博客

https://learnr.wordpress.com/2010/05/10/ggplot2-waterfall-charts/

但不知何故,当我在geom_text中编写相同的代码时,它会给我一个错误。可能是语法相关的问题。

1 个答案:

答案 0 :(得分:3)

这是ggplot的一种方法。

首先是数据:

df1 <- data.frame(z = c(-417, -12, 276, -276, 787, 14),
                  b =  LETTERS[1:6])

library(tidyverse)

cumsum坐标计算lagcumsum的{​​{1}}

geom_rect

enter image description here

这是一种更简单的方法,但我认为标签位置目前无法更改,但计划如下:

  

rect_text_labels_anchor(character)rect_text_labels应该如何   定位?在将来的版本中,我们可能会支持北方或   南锚,或定向定位(负向下,正向   现在,只支持中心。

df1 %>%
  mutate(val = cumsum(z),
         lag = c(0, lag(val)[-1]),
         b1 = as.numeric(b)) -> df1

ggplot(df1)+
  geom_rect(aes(xmin = b1 - 0.45,
                xmax = b1 + 0.45, ymin = lag, ymax = val)) +
  geom_text(aes(x = b1, y = val, label = val), #or `label = z`
            vjust = ifelse(df1$val < df1$lag, -0.2, 1)) + #geom_text vjust depends on the direction of the value
  scale_x_continuous(breaks = 1:6, labels = df1$b)

enter image description here

您也可以在ggplot中以相同的方式对其进行着色:

library(waterfalls)


df1 <- data.frame(z = c(-417, -12, 276, -276, 787, 14),
                  b =  LETTERS[1:6])

enter image description here

编辑:回答评论中的问题。

填充瀑布:

df1 %>%
  mutate(val = cumsum(z),
         lag = c(0, lag(val)[-1]),
         b1 = as.numeric(b),
         color = ifelse(val <lag, "down", "up")) -> df1

ggplot(df1)+
  geom_rect(aes(xmin = b1 - 0.45,
                xmax = b1 + 0.45, ymin = lag, ymax = val, fill = color)) +
  geom_text(aes(x = b1, y = val, label = z),
            vjust = ifelse(df1$val < df1$lag, -0.2, 1)) +
  scale_x_continuous(breaks = 1:6, labels = df1$b)

enter image description here

要回答你的geom_text代码出了什么问题,我需要看一下。除了你的代码工作,但它过于复杂的事情。我建议你学习一些tidyverse函数,数据操作会更加清晰。

还有一点需要注意,添加反向标记:

df1 <- data.frame(z = c(-417, -12, 276, -276, 787, 14),
                  b =  LETTERS[1:6],
                  group = rep(c("AB", "CD", "EF"), each = 2))

df1 %>%
  mutate(val = cumsum(z),
         lag = c(0, lag(val)[-1]),
         b1 = as.numeric(b),
         g1 = as.numeric(group)) -> df1

ggplot(df1)+
  geom_rect(aes(xmin = g1 - 0.45,
                xmax = g1 + 0.45, ymin = lag, ymax = val, fill = b)) +
  geom_text(aes(x = g1, y = val, label = z),
              vjust = ifelse(df1$val < df1$lag, -0.2, 1)) +
  scale_x_continuous(breaks = 1:3, labels = unique(df1$group))
当列名不包含特殊字符时,

不是必需的:

dataset$`TotalHeadcount`

EDIT2:要在x轴上更改顺序,首先要更改分组因子的级别,然后进行计算和绘图:

dataset$TotalHeadcount

enter image description here