首页 > 解决方案 > 如何更改长数据框的 x 轴上非数字变量的顺序?

问题描述

我有一个很长的数据框,想用三组制作一个 xy 图。x 变量不是数字变量,当它被绘制时,它遵循特定的顺序。我想改变这一点,而不是按序列 {002}、{011}、{10-2}、{100} 绘制数据,而是按序列 {002}、{011}、{100} 绘制数据, {10-2} 即反转 x 轴上的第 3 和第 4 位置。

由于我的真实数据框更长,以编程方式重新排列值的最佳方法是什么。

谢谢!

set.seed(129)

df_long <- data.frame(x=c('{002}', '{011}', '{100}', '{10-2}', '{002}', '{011}', '{100}', '{10-2}', '{002}', '{011}', '{100}', '{10-2}'),
                      type=rep(c('A', 'B', 'C'), each=4),
                      value=rnorm(12))

ggplot(df_long, aes(x = x, y = value, group = type)) +
  geom_point(aes(color = type)) +
  geom_line(aes(color = type))

标签: rggplot2

解决方案


由于离散尺度的限制决定了中断的顺序,并且可以给定一个函数,因此您可以使用匿名函数来反转第 3 和第 4 值。

library(ggplot2)
set.seed(129)

df_long <- data.frame(x=c('{002}', '{011}', '{100}', '{10-2}', '{002}', '{011}', '{100}', '{10-2}', '{002}', '{011}', '{100}', '{10-2}'),
                      type=rep(c('A', 'B', 'C'), each=4),
                      value=rnorm(12))

ggplot(df_long, aes(x = x, y = value, group = type)) +
  geom_point(aes(color = type)) +
  geom_line(aes(color = type)) +
  scale_x_discrete(
    limits = function(x) {
      x[3:4] <- x[4:3]
      x
    }
  )

reprex 包(v0.3.0)于 2020 年 12 月 23 日创建


推荐阅读