我正在使用dotplot进行每个x变量两个y变量的分析。我想安排图表,使其以y变量之一降序。我在aes()中使用了reorder()函数,它对它进行了稍微的重新排序,但不是完全重新排序。图表1是以前的样子,图表2是我使用reorder()之后的样子。
代码如下:
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行:
答案 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")
现在让我们谈谈您要做什么。您说要通过递减一个变量来进行排序。
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")
或
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")
我认为这里的关键是您要arrange
数据,然后设置因子水平以获得所需的输出。如果您的数据不是一个因素,则ggplot将使用字母顺序。您可能需要spread
数据才能使用上面概述的确切方法。
更新
通过安排两个变量,您可以在不分散数据的情况下执行此操作。
在这里,我们将上面的数据修改为长格式
df2 <- df %>% gather(measure, value, -car)
这样的情节
df2 %>%
ggplot(aes(x = car, y = value, color = measure))+
geom_point()
然后我们就可以不扩散而安排
df2 %>%
arrange(-value, measure) %>%
mutate(car = factor(car, levels = unique(car)))%>%
ggplot(aes(x = car, y = value, color = measure))+
geom_point()
或按分钟下降
df2 %>%
arrange(desc(measure), -value) %>%
mutate(car = factor(car, levels = unique(car)))%>%
ggplot(aes(x = car, y = value, color = measure))+
geom_point()