用2个变量在geom_dotplot中排序

时间:2018-07-30 10:00:44

标签: r ggplot2 charts dplyr

我正在使用dotplot进行每个x变量两个y变量的分析。我想安排图表,使其以y变量之一降序。我在aes()中使用了reorder()函数,它对它进行了稍微的重新排序,但不是完全重新排序。图表1是以前的样子,图表2是我使用reorder()之后的样子。

图1:enter image description here

图2:enter image description here

代码如下:

answers %>%
    ggplot(aes(x = reorder(locale, -percent) , y = percent, fill = box)) +
    geom_dotplot(binaxis='y', 
               stackdir='center', 
               dotsize = 1,
               binwidth = 0.01) + 
    geom_errorbar(aes(ymin = ci_lo, ymax = ci_hi), width = .5, position = position_dodge(0))

这就是“答案” df的外观。每个语言环境绘制的两个变量位于“框”列中-每个语言​​环境都有一个top_box和bottom_box行:

enter image description here

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,您没有提供和提供数据,但是我想我对您要去哪里出错有一个想法。

这是一些示例数据。我将使用经过修改的mtcars作为示例,其中我们将按品牌查看汽车的最小和最大重量。

library(tidyverse)
df <- mtcars %>% rownames_to_column() %>%
    select(car = rowname, wt) %>% 
    mutate(car = gsub("\\s.*?$", "", car)) %>%
    group_by(car) %>%
    mutate(n = n()) %>%
    filter(n > 1) %>%
    arrange(car,wt) %>%
    filter(row_number() == max(row_number())  | row_number() == min(row_number())) %>%
    select(-n) %>%
    ungroup() %>%
    mutate(stat = rep(c("min", "max"), nrow(.)/2)) %>%
    spread(stat, wt)

print(df)
#  car      max   min
#  Fiat    2.2   1.94
#  Hornet  3.44  3.22
#  Mazda   2.88  2.62
#  Merc    4.07  3.15
#  Toyota  2.46  1.84

这是该情节的样子:

df %>%
    ggplot(aes(x = car))+
    geom_point(aes(y = max), color = "red")+
    geom_point(aes(y = min), color = "blue")

enter image description here

现在让我们谈谈您要做什么。您说要通过递减一个变量来进行排序。

df %>%
    arrange(-max)%>%
    mutate(car = factor(car, levels = car))%>%
    ggplot(aes(x = car))+
    geom_point(aes(y = max), color = "red")+
    geom_point(aes(y = min), color = "blue")

enter image description here

df %>%
    arrange(-min)%>%
    mutate(car = factor(car, levels = car))%>%
    ggplot(aes(x = car))+geom_point(aes(y = max), color = "red")+
    geom_point(aes(y = min), color = "blue")

enter image description here

我认为这里的关键是您要arrange数据,然后设置因子水平以获得所需的输出。如果您的数据不是一个因素,则ggplot将使用字母顺序。您可能需要spread数据才能使用上面概述的确切方法。

更新

通过安排两个变量,您可以在不分散数据的情况下执行此操作。

在这里,我们将上面的数据修改为长格式

df2 <- df %>% gather(measure, value, -car)

这样的情节

df2 %>% 
    ggplot(aes(x = car, y = value, color = measure))+
    geom_point()

enter image description here

然后我们就可以不扩散而安排

df2 %>% 
    arrange(-value, measure) %>%
    mutate(car = factor(car, levels = unique(car)))%>%
    ggplot(aes(x = car, y = value, color = measure))+
    geom_point()

enter image description here

或按分钟下降

df2 %>% 
    arrange(desc(measure), -value) %>%
    mutate(car = factor(car, levels = unique(car)))%>%
    ggplot(aes(x = car, y = value, color = measure))+
    geom_point()

enter image description here