【问题标题】:Sorting ggplot2 geom_posterior plot排序ggplot2 geom_posterior图
【发布时间】:2020-05-02 11:53:53
【问题描述】:

我有一个包含 3 个分布的数据集,每个分布有 100 个观察值,我想使用 ggplot 后验图来绘制这些分布。

数据:

Name Value
A1    1
A1    1.2
A1    0.5
A2    5
A2    3
A2    -1
A3    5
A3    2
A3    1

问题:

我无法按平均值对值进行排序,图中的预期结果应该是“A2,A3,A1”。

尝试的解决方案:

ggplot(value1, aes(reorder(mean(value)), x = value, y = name))+
  geom_posterior() +
  xlab("value")  + theme_bw()

带数据的完整代码:

library("tidyverse")
library("ggdistribute") #plot geom_posterior

value1 <- rnorm(n=100, mean=1, sd=1) %>% as.data.frame()
value2 <- rnorm(n=100, mean=3, sd=1) %>% as.data.frame()
value3 <- rnorm(n=100, mean=1, sd=2) %>% as.data.frame()

value1$name <- "A1"
value2$name <- "A2"
value3$name <- "A3"

value1 <- rbind(value1,value2,value3) 
colnames(value1) <- c("value","name")

ggplot(value1, aes(reorder(mean(value)), x = value, y = name))+
  geom_posterior() +
  xlab("value")  + theme_bw()

目前的结果:

【问题讨论】:

  • 试试ggplot(value1, aes(x = value, y = reorder(name, value, mean)))
  • @Tjebo 它的库(“ggdistribute”),我编辑了这个问题。
  • @Ben 这行得通,如果将评论转换为答案,我可以接受你的答案

标签: r ggplot2


【解决方案1】:

您可以按平均重新排序:

reorder(name, value, mean)

指定将对其级别进行重新排序的向量、其值的子集确定顺序的向量以及应用于子集的函数(在本例中为mean)。

library(tidyverse)
library(ggdistribute)

set.seed(123)

value1 <- rnorm(n=100, mean=1, sd=1) %>% as.data.frame()
value2 <- rnorm(n=100, mean=3, sd=1) %>% as.data.frame()
value3 <- rnorm(n=100, mean=1, sd=2) %>% as.data.frame()

value1$name <- "A1"
value2$name <- "A2"
value3$name <- "A3"

value1 <- rbind(value1,value2,value3) 
colnames(value1) <- c("value","name")

ggplot(value1, aes(x = value, y = reorder(name, value, mean)))+
  geom_posterior() +
  xlab("value")  + theme_bw()

情节

【讨论】:

    【解决方案2】:

    这可能是一种解决方法 - 如果您将名称更改为有序因子并按照您希望图表显示的顺序提供级别,则 ggplot 使用因子级别进行排序:

    my_levels <- value1 %>%
        group_by(name) %>%
        summarize(mean = mean(value)) %>% 
        arrange(mean) %>%
        select(name)
    
    value1$name <-factor(value1$name, levels = my_levels$name, ordered = TRUE)
    
    ggplot(value1, aes(reorder(mean(value)), x = value, y = name))+
      geom_posterior() +
      xlab("value")  + theme_bw()
    

    【讨论】:

    • 有趣的答案,遗憾的是我有太多级别无法手动定义顺序
    • 这是否有助于创建级别向量:my_levels &lt;- value1 %&gt;% group_by(name) %&gt;% summarize(mean = mean(value)) %&gt;% arrange(mean) %&gt;% select(name)
    • 非常感谢 - 诚然,Ben 的更优雅 :-)
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多