如何通过多个变量重新排序绘图?

问题描述 投票:0回答:1

我试图先按

am
然后按
mpg
重新排序情节。附在 R 中使用 ggplot2 的结果中。

我试图使用siuba和plotnine获得相同的结果。下面是我到目前为止的代码。

(
mtcars 
    >> arrange(_.am, _.mpg)
    >> mutate(model = fct_reorder(_.model, _.am))
    >> ggplot(aes(y="mpg", x="model", fill='factor(am)'))
    + geom_col()
    + labs(fill = "Automatic/Manual Transmission")
    + coord_flip()
)

example

plotnine
1个回答
1
投票

更新

由于我原来的答案不再在这里工作,所以更新版本使用现在可用的

fct_inorder
,但最重要的是在重新
arrange
数据之后和通过
fct_inorder
设置顺序之前重置索引。在我发布原始答案时,这一步是不必要的,实际上对我来说看起来像是一个错误。

from plotnine import *
from siuba import _, arrange, mutate
from siuba.dply.forcats import fct_inorder

mtcars1 = (
    mtcars 
        >> arrange(-_.am, _.mpg)
    ).reset_index()

(
mtcars1
    >> mutate(name = fct_inorder(_.name))
    >> ggplot(aes(y="mpg", x="name", fill='factor(am)'))
    + geom_col()
    + labs(fill = "Automatic/Manual Transmission")
    + coord_flip()
)

enter image description here

原答案

如果我应该在 R 中复制你的情节,我会使用

dplyr::arrange
+
forcats::fct_inorder
。由于
siuba
不提供与
fct_inorder
等效的功能,您可以通过首先按所需顺序排列、添加行号索引列并按此索引列重新排序来实现所需结果:

from plotnine import *
from siuba import _, arrange, mutate
from siuba.dply.forcats import fct_reorder
(
mtcars 
    >> arrange(-_.am, _.mpg)
    >> mutate(model = fct_reorder(_.model, _.reset_index().index))
    >> ggplot(aes(y="mpg", x="model", fill='factor(am)'))
    + geom_col()
    + labs(fill = "Automatic/Manual Transmission")
    + coord_flip()
)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.