【问题标题】:defining axis breaks based on other column without saving dataframe before根据其他列定义轴中断而不保存数据框
【发布时间】:2019-12-14 14:03:30
【问题描述】:

我经常创建如下图,其中轴刻度/标签表示累积总和。这一切都很好,但需要我先创建 tibble,然后才能使用 scale_y_continous(breaks=my_df$cumsum) 解决新的中断。

library(tidyverse)


my_df <- tibble::tribble(
  ~group, ~value,
  "a",  10,
  "b",  20,
  "c",  60
  ) %>% 
  mutate(group=as_factor(group)) %>%
  arrange(desc(group)) %>% 
  mutate(value_cum=cumsum(value))
my_df
#> # A tibble: 3 x 3
#>   group value value_cum
#>   <fct> <dbl>     <dbl>
#> 1 c        60        60
#> 2 b        20        80
#> 3 a        10        90

my_df %>% 
  ggplot()+
  geom_bar(aes(fill=group,
               y=value,
               x=1),
           stat="identity",
           position=position_stack())+
  scale_y_continuous(breaks=my_df$value_cum)+
  coord_flip()+
  theme(axis.text.y = element_blank())

为了让事情更顺利一点,我想知道是否有一种方法可以直接“即时”处理新创建的value_cum 变量,而无需之前保存数据帧/小标题。希望下面的失败尝试清楚地表明了我对什么感兴趣。问题基本上是我如何处理输入 ggplot 但之前没有保存的值。

非常感谢。



tibble::tribble(
  ~group, ~value,
  "a",  10,
  "b",  20,
  "c",  60) %>% 
  mutate(group=as_factor(group)) %>%
  arrange(desc(group)) %>% 
  mutate(value_cum=cumsum(value)) %>% 
  ggplot()+
  geom_bar(aes(fill=group,
               y=value,
               x=1),
           stat="identity",
           position=position_stack()) +
  scale_y_continuous(breaks=.$value_cum))+  #does not work
  coord_flip()+
  theme(axis.text.y = element_blank())

reprex package (v0.3.0) 于 2019 年 12 月 14 日创建

【问题讨论】:

  • 如果我将.$value_cum 更改为.data$value_cum,它对我有用
  • @AHart 非常感谢。不幸的是,这对我不起作用。我只是得到一个空白轴(没有刻度或标签)。我正在使用 ggplot2 包版本“3.2.1.9000”。
  • 抱歉没听清楚!我在下面添加了一个答案,使用大括号来封装情节。我希望这有效!

标签: r ggplot2 axis-labels


【解决方案1】:

我认为如果您将整个图放在大括号中并在对ggplot 的初始调用中指定数据,它应该可以工作:

tibble::tribble(
  ~group, ~value,
  "a",  10,
  "b",  20,
  "c",  60) %>%
  mutate(group = as_factor(group)) %>%
  arrange(desc(group)) %>% 
  mutate(value_cum = cumsum(value)) %>% 
  {
    ggplot(.)+
      geom_bar(aes(fill=group,
                   y=value,
                   x=1),
               stat="identity",
               position=position_stack()) +
      coord_flip()+
      scale_y_continuous(breaks=.$value_cum) +  #does not work
      theme(axis.text.y = element_blank())  
  }

【讨论】:

    【解决方案2】:

    你可以使用一个函数。有几种方法可以解决这个复杂性范围内的问题。这里有一些更简单的规模。不幸的是,我不认为将源数据帧传回自定义函数是微不足道的。

    数据

    my_df <- tibble::tribble(
      ~group, ~value,
      "a",  10,
      "b",  20,
      "c",  60
    )
    

    将整个情节包装成一个函数

    f_plot <- function(df) {
    
      my_breaks <- df %>% 
        mutate(group=as_factor(group)) %>%
        arrange(desc(group)) %>% 
        mutate(value_cum=cumsum(value)) %>%
        pull()
    
      ggplot(my_df) +
        geom_bar(aes(fill=group,
                     y=value,
                     x=1),
                 stat="identity",
                 position=position_stack()) +
        scale_y_continuous(breaks = my_breaks) +
        coord_flip() +
        theme(axis.text.y = element_blank())
    }
    
    f_plot(my_df)
    

    将中断计算包装到一个函数中

    scale_breaks1 <- function(df) {
    
      my_breaks <- df %>% 
        mutate(group=as_factor(group)) %>%
        arrange(desc(group)) %>% 
        mutate(value_cum=cumsum(value)) %>%
        pull()
    
      scale_y_continuous(breaks = my_breaks)
    
    }
    
    ggplot(my_df) +
      geom_bar(aes(fill=group,
                   y=value,
                   x=1),
               stat="identity",
               position=position_stack()) +
      scale_breaks1(my_df) +
      coord_flip() +
      theme(axis.text.y = element_blank())
    

    将图形对象推入函数中

    scale_breaks2 <- function(p) {
    
      df <- p$data
    
      my_breaks <- df %>% 
        mutate(group=as_factor(group)) %>%
        arrange(desc(group)) %>% 
        mutate(value_cum=cumsum(value)) %>%
        pull()
    
      p + scale_y_continuous(breaks = my_breaks)
    
    }
    
    p <- ggplot(my_df) +
      geom_bar(aes(fill=group,
                   y=value,
                   x=1),
               stat="identity",
               position=position_stack()) +
      coord_flip() +
      theme(axis.text.y = element_blank())
    
    p %>% scale_breaks2()
    

    【讨论】:

      猜你喜欢
      • 2017-01-16
      • 2020-08-25
      • 2017-01-03
      • 2018-09-06
      • 2019-12-09
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多