【问题标题】:Reorder panels in ridgeline plot重新排列山脊线图中的面板
【发布时间】:2020-06-01 02:13:37
【问题描述】:

我有一个这样的数据框:

set.seed(3467)

 df<- data.frame(method= c(rep("A", 1000), rep("B", 1000), rep("C", 1000)), 
        beta=c(rnorm(1000, mean=0, sd=1),rnorm(1000, mean=2, sd=1.4),rnorm(1000, mean=0, sd=0.5)))

我希望创建一个类似于此的山脊线图:

library(ggplot2)
library(ggridges)

ggplot() +
geom_rect(data = data.frame(x = 1),
        xmin = -0.391, xmax = 0.549, ymin = -Inf, ymax = Inf,
        alpha = 0.5, fill = "gray") +
 geom_density_ridges(data = df, aes(x = beta, y = method, color = method, fill = method),
                  size=0.75)+
 xlim(-5,5)+
 scale_fill_manual(values = c("#483d8b50", "#0072B250","#228b2250")) +
 scale_color_manual(values = c("#483d8b", "#0072B2", "#228b22"), guide = "none") +
 stat_density_ridges(data = df, aes(x = beta, y = method, color = method, fill = method),
                  quantile_lines = TRUE, quantiles = c(0.025, 0.5, 0.975), alpha = 0.6, size=0.75)+
scale_y_discrete(expand = expand_scale(add = c(0.1, 0.9)))

但是,我希望按method= "B", "C", "A" 而不是method= "A", "B", "C" 的顺序排列y 轴

我尝试了以下方法来重新排列密度图,但没有成功:

library(dplyr)
df %>%
 mutate(method = fct_relevel(method, 
                        "B", "C", "A"))%>%
ggplot() +
geom_rect(data = data.frame(x = 1),
        xmin = -0.391, xmax = 0.549, ymin = -Inf, ymax = Inf,
        alpha = 0.5, fill = "gray") +
 geom_density_ridges(data = df, aes(x = beta, y = method, color = method, fill = method),
                  size=0.75)+
 xlim(-5,5)+
 scale_fill_manual(values = c("#483d8b50", "#0072B250","#228b2250")) +
 scale_color_manual(values = c("#483d8b", "#0072B2", "#228b22"), guide = "none") +
 stat_density_ridges(data = df, aes(x = beta, y = method, color = method, fill = method),
                  quantile_lines = TRUE, quantiles = c(0.025, 0.5, 0.975), alpha = 0.6, size=0.75)+
scale_y_discrete(expand = expand_scale(add = c(0.1, 0.9)))

【问题讨论】:

    标签: r ggplot2 ggridges ridgeline-plot


    【解决方案1】:

    你快到了。 - 您需要在fct_relevel 中指定levels 参数。 (见?fct_relevel:没有levels参数,但是...,你必须指定它的名字!)

    library(tidyverse)
    library(ggridges)
    set.seed(3467)
    
    df<- data.frame(method= c(rep("A", 1000), rep("B", 1000), rep("C", 1000)), 
                    beta=c(rnorm(1000, mean=0, sd=1),rnorm(1000, mean=2, sd=1.4),rnorm(1000, mean=0, sd=0.5)))
    
    # here is the main change: 
    df <- df %>%
      mutate(method = fct_relevel(method, levels = "B", "C", "A"))
    
      ggplot(df) +
      geom_density_ridges(data = df, aes(x = beta, y = method, color = method, fill = method))
    #> Picking joint bandwidth of 0.225
    

    reprex package (v0.3.0) 于 2020-02-17 创建

    【讨论】:

      【解决方案2】:

      如果您将方法列更改为有序因子,它应该可以工作:

      df$method <- factor(df$method, levels = c("C", "A", "B"), ordered = TRUE)
      

      【讨论】:

      • 这种方法实际上甚至不需要有序参数
      猜你喜欢
      • 2020-10-08
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2016-08-03
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多