【问题标题】:ggplot geom _labels how to group by group AND x axis valuesggplot geom _labels如何按组和x轴值分组
【发布时间】:2020-10-16 13:51:02
【问题描述】:

我有这段代码来绘制一个直方图,其中 y = 计数,x = 一个因子,我添加了带有组百分比的标签

ggplot(aes(IntervalDays, fill = group)) + 
  geom_histogram(stat="count") +
  geom_label(stat = "count", aes(label = round(..prop..*100, digits = 1), 
group = c(group)), 
position = position_stack(vjust = 0.5))

绘制这个

在这种情况下,我让每组在两个条之间添加 100%(对于 A 组:51.5 + 48.5 = 100)。我可以更改它,以查看每个条中每种颜色的百分比(例如,我想知道组 [5-10] 的红色/绿色/蓝色百分比和绿色/红色/蓝色百分比的总和将是 100%

这就是数据的样子

group   IntervalDays
A     [0,5]
C     (5,10]
A     (5,10]
A     [0,5]
C     (5,10]
A     [0,5]
B     (5,10]
A     (5,10]
C     (5,10]
B     (5,10]
A     [0,5]
A     [0,5]
C     [0,5]
.
.
.

非常感谢

我。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。但你可能想要position_fill 而不是position_stack
  • 另外,它根本不清楚你在问什么。稍微清理一下问题。

标签: r ggplot2


【解决方案1】:

这可以通过使用dplyr 稍微处理您的数据然后将stat 更改为"identity" 来实现。

我正在使用您提供的样本中的这些数据:

df <- structure(list(group = c("A", "C", "A", "A", "C", "A", "B", "A", 
"C", "B", "A", "A", "C"), IntervalDays = c("[0,5]", "(5,10]", 
"(5,10]", "[0,5]", "(5,10]", "[0,5]", "(5,10]", "(5,10]", "(5,10]", 
"(5,10]", "[0,5]", "[0,5]", "[0,5]")), row.names = c(NA, -13L
), class = "data.frame")

当应用于df 时,您的绘图代码给出了下图(到目前为止,我从您的原始绘图代码中唯一更改的是geom_histogramgeom_bar,因为这对您的数据类型更有意义):

library(ggplot2)

# original plot code, changed to geom_bar
ggplot(df, aes(x = IntervalDays, fill = group)) + 
        geom_bar(stat = "count") +
        geom_label(stat = "count", aes(label = round(..prop..*100, digits = 1), 
                                       group = c(group)), 
                   position = position_stack(vjust = 0.5))

我们不希望这样做,因为它计算的是组的比例,而不是列的比例。为了获得列比例,我使用了dplyr,如下所示:

library(dplyr)

df_new <- df %>% group_by(group, IntervalDays) %>%
        summarise(sum = n()) %>% group_by(IntervalDays) %>%
        mutate(col_prop = sum/sum(sum))
> df_new
# A tibble: 5 x 4
# Groups:   IntervalDays [2]
  group IntervalDays   sum col_prop
  <chr> <chr>        <int>    <dbl>
1 A     (5,10]           2    0.286
2 A     [0,5]            5    0.833
3 B     (5,10]           2    0.286
4 C     (5,10]           3    0.429
5 C     [0,5]            1    0.167

然后我使用尽可能多的原始代码绘制new_df。主要区别是我已将stat"count" 更改为"identity",以便明确绘制sum 中的值。由于我们自己计算了col_prop,这就是我分配给label 参数的值:

ggplot(df_new, aes(x = IntervalDays, y = sum, fill = group)) +
        geom_bar(stat = "identity") +
        geom_label(stat = "identity", aes(label = round(col_prop*100, digits = 1),
                                          group = group),
                   position = position_stack(vjust = 0.5))


在计算原始比例时,您可以了解ggplot 在幕后所做的精髓。是这样的,没有我们上面看到的第二个group_by

df %>% group_by(group, IntervalDays) %>%
        summarise(sum = n()) %>%
        mutate(col_prop = sum/sum(sum))
# A tibble: 5 x 4
# Groups:   group [3]
  group IntervalDays   sum col_prop
  <chr> <chr>        <int>    <dbl>
1 A     (5,10]           2    0.286
2 A     [0,5]            5    0.714
3 B     (5,10]           2    1    
4 C     (5,10]           3    0.75 
5 C     [0,5]            1    0.25

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-17
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多