0

在这里,我使用数据制作了一个绘图,显示了以特定方式排序的每个“bins”中对应的“d”值。

如您所见,我已明确命令它们(在 ggplot 代码中)创建下图。

有没有一种优雅的方法可以通过引入顺序来做同样的事情,正如您可能看到的那样,我已经为此示例引入了列顺序。

如果可能,我正在尝试使用forecats 包中的 fct_reorder()重写代码,或者找到任何其他可能的优雅方法来实现相同的结果,主要是因为我想重用和概括其他数据集或自定义函数。

代码看起来有点像下面,为了简单起见,我创建了一个示例数据集。

set.seed(42)
order <- as.character(c(5,6,7,8,9,1,2,3,4))
seg <- as.character(c('a', 'b', 'c','a', 'b', 'c','a', 'b', 'c'))
bins <- as.character(c('-5% - 5%','5% - 10%','10% - 15%','15% - 20%', '>20%','<-20%','-20% - -15%','-15% - -10%','-10% - -5%'))
d <- as.numeric(sample(0:100, size = 9, replace = TRUE))
df <- as.data.frame(cbind(order, seg, bins, d))

ggplot(df, aes(fill = seg, y = d, x = bins)) +geom_col()+ scale_x_discrete(limits= c('<-20%','-20% - -15%','-15% - -10%','-10% - -5%','-5% - 5%','5% - 10%','10% - 15%','15% - 20%', '>20%'))

生成的图如下:

在此处输入图像描述

提前感谢您的建议。:)

代码变化:

根据进来的建议,我查看了代码并将其调整为不使用 cbind(),请在此处找到调整后的代码:

    set.seed(42)
order <- as.character(c(5,6,7,8,9,1,2,3,4))
seg <- as.character(c('a', 'b', 'c','a', 'b', 'c','a', 'b', 'c'))
bins <- as.character(c('-5% - 5%','5% - 10%','10% - 15%','15% - 20%', '>20%','<-20%','-20% - -15%','-15% - -10%','-10% - -5%'))
d <- as.numeric(sample(0:100, size = 9, replace = TRUE))
df <- data.frame(order, seg, bins, d)

ggplot(df, aes(fill = seg, y = d, x = bins)) +geom_col()+ scale_x_discrete(limits= c('<-20%','-20% - -15%','-15% - -10%','-10% - -5%','-5% - 5%','5% - 10%','10% - 15%','15% - 20%', '>20%'))

谢谢

4

1 回答 1

1

您可以提取每个 bin 的下限,将其转换为数字,并将其用于排序。处理小于和大于符号的位:替换<为负无穷大和>正无穷大。

library(dplyr)
library(ggplot2)
library(stringr)

df_ordered <- df %>%
  mutate(lower = case_when(
    str_detect(bins, "^>") ~ Inf,
    str_detect(bins, "^<",) ~ -Inf,
    TRUE ~ as.numeric(str_extract(bins, "^\\-?\\d+"))
  )) %>%
  mutate(bins = forcats::fct_reorder(bins, lower))

df_ordered
#>   seg        bins   d lower
#> 1   a    -5% - 5%  48    -5
#> 2   b    5% - 10% 100     5
#> 3   c   10% - 15%  64    10
#> 4   a   15% - 20%  24    15
#> 5   b        >20%  73   Inf
#> 6   c       <-20%  99  -Inf
#> 7   a -20% - -15%  17   -20
#> 8   b -15% - -10%  48   -15
#> 9   c  -10% - -5%  46   -10

ggplot(df_ordered, aes(x = bins, y = d)) +
  geom_col()

于 2019-12-11T05:10:55.287 回答