R ggplot2中离散y轴的反转顺序

R ggplot2中离散y轴的反转顺序,r,ggplot2,R,Ggplot2,情况和数据 我有一个比赛中运动员位置的数据帧(我已经将它融化了,以便与ggplot2一起使用): df尝试以下操作: g <- ggplot(df, aes(x=distanceRemaining, y =position, colour=athlete, group = athlete)) g <- g + geom_point() g <- g + geom_line(size=1.15) g <- g + scale_y_continuous(trans = "r

情况和数据

我有一个比赛中运动员位置的数据帧(我已经将它融化了,以便与
ggplot2
一起使用):

df尝试以下操作:

g <- ggplot(df, aes(x=distanceRemaining, y =position, colour=athlete, group = athlete))
g <- g + geom_point()
g <- g + geom_line(size=1.15)
g <- g +  scale_y_continuous(trans = "reverse", breaks = unique(df$position))
g

g您只需将位置变量转换为一个因子,然后反转其级别:

require(dplyr)
df <- df %>% mutate(position = factor(position), 
                    position = factor(position, levels = rev(levels(position)))
require(dplyr)
df%突变(位置=系数(位置),
位置=系数(位置,标高=转速(标高(位置)))
然后,使用您的代码,您将得到:

对于离散轴,使用reorder()对我有效。在上述问题的背景下,它看起来像这样:

ggplot(df, aes(x = distanceRemaining, y = reorder(position, desc(position))))
希望这能有所帮助。

根据:

添加
scale\u y\u discrete(限制=rev(级别(系数))

到您的ggplot命令。

使用
forcats
包的另一个选项

ggplot(df, aes(x = distanceRemaining, y = forcats::fct_rev(factor(position))))
这样做的好处是将所有内容都保存在
ggplot
调用中,并且可以很好地使用其他选项,例如
coord\u flip
facets\u wrap(…,scales=“free”)

有一个解决方案,
scale\u*\u discrete(limits=rev)
,例如:

tibble(x=1:26,y=letters) %>% 
  ggplot(aes(x,y)) +
    geom_point() +
    scale_y_discrete(limits=rev)

您能将
缩放y\U反转()与
缩放y\U离散()一起使用吗
,或另一种将整数保持在y轴上的方法?至少在ggplot2版本2.1中,这对我来说不起作用。
缩放y_连续
将抛出一个错误,如果您向其输入一个因子。用于因子的版本将是
缩放y_离散(限制=rev(级别(df$distance剩余))
。对于未来陷入困境的人,如果你在某个时候用dplyr创建了一个组df,你可能需要首先将你的tible解组,以获得正确的顺序。也许最有用的答案来自@Frederik ZiebellThank,但我会选择将其保留在
ggplot2
调用中的答案。
trans=“反转”
方法不适用于真正离散的(例如字符)比例。
比例(scale_y_reverse()
也可以工作,因为y轴可以强制为连续比例…您可以通过
ggplot(df,aes(x=剩余距离,y=因子(位置,级别=c(1:10)),颜色=运动员,组=运动员))将其保留在ggplot2调用中
谢谢,这解决了
coord_flip()
的一个恼人问题。我非常喜欢这个解决方案。它不会改变或重新调整因子本身(即使是暂时的)。只需直接设置绘图记号/标签的顺序。这仅在有因子的情况下有效。否则,我使用@David Bloom的
重新排序
解决方案。我发现这是最好的解决方案,因为它不需要指向已传递给ggplot的内容以外的任何内容。谢谢!
ggplot(df, aes(x = distanceRemaining, y = forcats::fct_rev(factor(position))))
tibble(x=1:26,y=letters) %>% 
  ggplot(aes(x,y)) +
    geom_point() +
    scale_y_discrete(limits=rev)