【问题标题】:How to change axis text after reordering the axis by value in ggplot在ggplot中按值重新排序轴后如何更改轴文本
【发布时间】:2021-01-16 01:13:06
【问题描述】:

我正在尝试制作一个 ggplot,其中 y 轴上的分类变量的顺序是 1) 由另一个变量的值重新排序,然后 2) 将轴文本交换为另一个值,其中新的给定级别标签可以有多个来自原始变量的对应值。这是完成第一部分的可重现示例:

df <- data.frame(id = rep(letters[1:5], each=10),
                 id_2 = rep(c('group1', 'group2', 'group1', 'group3', 'group4'), each=10),
                 date = rep(seq(0, 9), 5),
                 start_point = rep(rnorm(5, 0, 1), each=10),
                 change_rate = rep(rnorm(5, 0, 1), each=10),
                 variance = rnorm(50, 0, 1))

df$fill_val <- df$start_point + df$date*df$change_rate + df$variance

ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
  geom_tile()

这会产生:

现在,我想用id_2 中的值替换 y 轴上的标签。请注意,您当然可以在这个玩具示例中手动执行此操作,如下所示:

ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
  geom_tile() +
  scale_y_discrete(breaks=c('d', 'b', 'a', 'e', 'c'), 
                   labels=c('group3', 'group2', 'group1', 'group4', 'group1'))

制作:

但是对于真实数据,我需要反复这样做,并且在某些图中y轴上可能有几十个值,所以不能像上面那样手动修复。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这可以通过标签的命名向量来实现。该向量可以使用例如构建tibble::deframe:

    set.seed(42)
    
    df <- data.frame(id = rep(letters[1:5], each=10),
                     id_2 = rep(c('group1', 'group2', 'group1', 'group3', 'group4'), each=10),
                     date = rep(seq(0, 9), 5),
                     start_point = rep(rnorm(5, 0, 1), each=10),
                     change_rate = rep(rnorm(5, 0, 1), each=10),
                     variance = rnorm(50, 0, 1))
    
    df$fill_val <- df$start_point + df$date*df$change_rate + df$variance
    
    library(ggplot2)
    library(tibble)
    library(dplyr)
    
    labels <- df %>% 
      select(id, id_2) %>% 
      distinct() %>% 
      tibble::deframe()
    
    ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
      geom_tile() +
      scale_y_discrete(labels = labels)
    

    【讨论】:

    • @Duck。谢谢。当然还有tibble::enframe可以将命名向量转换为两列tibble。
    • 很高兴知道这一点!
    【解决方案2】:

    你也可以试试:

    library(ggplot2)
    #Data
    df <- data.frame(id = rep(letters[1:5], each=10),
                     id_2 = rep(c('group1', 'group2', 'group1', 'group3', 'group4'), each=10),
                     date = rep(seq(0, 9), 5),
                     start_point = rep(rnorm(5, 0, 1), each=10),
                     change_rate = rep(rnorm(5, 0, 1), each=10),
                     variance = rnorm(50, 0, 1))
    
    df$fill_val <- df$start_point + df$date*df$change_rate + df$variance
    
    #Keys
    vals <- df[!duplicated(df$id),c('id','id_2')]
    #Plot
    ggplot(df, aes(x=date, y=reorder(id, fill_val), fill=fill_val)) +
      geom_tile()+
      scale_y_discrete(breaks=vals$id, 
                       labels=vals$id_2)
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2020-08-05
      相关资源
      最近更新 更多