基于其他列定义轴打断,之前不保存dataframe

基于其他列定义轴打断,之前不保存dataframe,r,ggplot2,axis-labels,R,Ggplot2,Axis Labels,我经常创建下面这样的图,其中的轴刻度/标签指示累计总和。这一切都很好,但需要先创建TIBLE,然后才能使用scale\u y\u continuous(breaks=my\u df$cumsum)处理新的中断 库(tidyverse) 我的_df% 突变(组=as_因子(组))%>% 排列(描述(组))%>% 变异(值_cum=cumsum(值)) 我的 #>#tibble:3 x 3 #>组值 #> #>1 c 60 #>2B2080 #>3 a 10 90 我的_df%>%

我经常创建下面这样的图,其中的轴刻度/标签指示累计总和。这一切都很好,但需要先创建TIBLE,然后才能使用
scale\u y\u continuous(breaks=my\u df$cumsum)
处理新的中断

库(tidyverse)
我的_df%
突变(组=as_因子(组))%>%
排列(描述(组))%>%
变异(值_cum=cumsum(值))
我的
#>#tibble:3 x 3
#>组值
#>         
#>1 c 60
#>2B2080
#>3 a 10 90
我的_df%>%
ggplot()+
geom_bar(aes)(填充=组,
y=值,
x=1),
stat=“identity”,
位置=位置\堆栈()+
连续缩放(间隔=我的df$value\u cum)+
coord_flip()+
主题(axis.text.y=element\u blank())

为了让事情变得更加顺利,我想知道是否有一种方法可以直接“动态”地处理新创建的
value\u cum
变量,而不需要保存数据帧/tibble。下面这个失败的尝试说明了我对什么感兴趣。问题基本上是如何处理输入ggplot但以前未保存的值

非常感谢


tibble::tribble(
~group,~value,
“a”,10,
“b”,20,
“c”,60)%>%
突变(组=as_因子(组))%>%
排列(描述(组))%>%
变异(值_cum=cumsum(值))%>%
ggplot()+
geom_bar(aes)(填充=组,
y=值,
x=1),
stat=“identity”,
位置=位置\堆栈()+
连续缩放(中断=.$value_cum))+#不起作用
coord_flip()+
主题(axis.text.y=element\u blank())

由(v0.3.0)于2019-12-14创建,我认为如果将整个绘图放在大括号中,并在对
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())  
  }


我认为,如果您将整个绘图放在大括号中,并在对
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())  
  }


你可以使用一个函数。有几种方法可以解决这个复杂的范围。下面是一些更简单的例子。不幸的是,我不认为将源数据帧传递回自定义函数是微不足道的

数据

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())
}
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)

}
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)

}
将图形对象推入函数中

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())
}
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)

}
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)

}
scale\u breaks2%
变异(值_cum=cumsum(值))%>%
拉
p+比例y连续(中断=我的中断)
}
p%刻度线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())
}
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)

}
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)

}
将图形对象推入函数中

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())
}
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)

}
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)

}
scale\u breaks2%
变异(值_cum=cumsum(值))%>%
拉
p+比例y连续(中断=我的中断)
}
p%刻度线2()

如果我将
$value\u cum
更改为
.data$value\u cum
@a非常感谢。不幸的是,这对我不起作用。我只是得到一个空白轴(没有记号或标签)。我使用的是ggplot2软件包版本“3.2.1.9000”。很抱歉没有捕捉到!我在下面添加了一个答案,使用大括号来封装该图。我希望这能奏效!如果我将
$value\u cum
更改为
.data$value\u cum
@a非常感谢。不幸的是,这对我不起作用。我只是得到一个空白轴(没有记号或标签)。我使用的是ggplot2软件包版本“3.2.1.9000”。很抱歉没有捕捉到!我在下面添加了一个答案,使用大括号来封装该图。我希望这能奏效!