Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 具有2个变量的geom_点图中的排序_R_Ggplot2_Charts_Dplyr - Fatal编程技术网

R 具有2个变量的geom_点图中的排序

R 具有2个变量的geom_点图中的排序,r,ggplot2,charts,dplyr,R,Ggplot2,Charts,Dplyr,我正在使用点图进行分析,每个x变量有两个y变量。我想安排图表,使其下降一个y变量。我在aes中使用了reorder函数,它稍微重新排序,但不是完全重新排序。图1是它之前的样子,图2是我使用重新排序后的样子 图1: 图2: 代码如下: 答案%>% ggplotaesx=reorderlocale,-百分比,y=percent,fill=box+ geom_dotplotbinaxis='y', stackdir='center', dotsize=1, binwidth=0.01+ geom_e

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

图1:

图2:

代码如下:

答案%>% ggplotaesx=reorderlocale,-百分比,y=percent,fill=box+ geom_dotplotbinaxis='y', stackdir='center', dotsize=1, binwidth=0.01+
geom_errorbaraesymin=ci_lo,ymax=ci_hi,width=.5,position=position_dodge0正如评论中指出的那样,您没有提供数据,但我想我知道您的错误所在

下面是一些示例数据。我将使用修改后的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 %>%
    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")

我认为这里的关键是,您需要整理数据,然后设置因子级别以获得所需的输出。如果您的数据不是一个因素,那么ggplot将使用字母顺序。您可能需要传播数据,以便使用上述确切方法

更新


通过安排两个变量,您可以在不传播数据的情况下实现这一点

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")
这里我们将把上面的数据修改为长格式

df2 <- df %>% gather(measure, value, -car)
然后我们可以在不扩散的情况下进行安排

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()

欢迎来到SO。在尝试使用代码片段功能时做得很好,我从未使用过它,而且它看起来很漂亮。但是,-如果您之前没有定义答案并加载所需的包,那么您的代码将不起作用。请提供此示例数据,您可能会发现forcats::reorder在这方面很有用,因为它以直观的方式管理因子级别的顺序。确保在将数据帧传递给ggplot2之前执行此操作。谢谢!我不知道如何上传我的数据,这就是为什么我只是把截图,但感谢你给了这个机会。我想关键是我需要把数据分散开来。实际上,我在同一列中有两个变量,只是试图对该列的一部分进行排序,这就是它变得混乱的地方。把它摊开解决了问题,然后这个安排就起作用了。非常感谢。你可以这样做而不扩散。等一下,我会更新的。我只是没早点想到。
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()