Ggplot со строками по оси x

Я пытаюсь сделать сюжет с несколькими кривыми в нем. Ось x не является числовыми значениями, а строками.

Это прекрасно работает (например, как построить все столбцы кадра данных в R):

require(ggplot2)
df_ok <- rbind(data.frame(x=4:1,y=rnorm(4),d="d1"),data.frame(x=3:1,y=rnorm(3),d="d2"))
ggplot(df_ok, aes(x,y)) + geom_line(aes(colour=d))

Но мои данные выглядят так:

require(ggplot2)
df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2"))
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d))

Я получаю сообщение об ошибке geom_path: каждая группа состоит только из одного наблюдения. Вам нужно настроить эстетику группы?. Несмотря на то, что линии графика не отображаются, ось отображается, а ось x содержит правильные метки - но также и в неправильном порядке.

Любая идея, как это сделать как можно проще? (Также обратите внимание на отсутствующие значения x для некоторых рядов).

Ответы

Ответ 1

Ваша проблема в том, что переменная x является фактором. Итак, измените свой фрейм данных и сделайте x двойным:

df = rbind(data.frame(x=4:1,y=rnorm(4),d="d1"), 
           data.frame(x=3:1,y=rnorm(3),d="d2"))

Участок как обычный

g = ggplot(df, aes(x,y)) + geom_line(aes(colour=d))

но явно измените масштаб оси x:

g + scale_x_continuous(breaks=1:4, labels=c("one", "two", "three", "four")) 

Чтобы переименовать переменную, попробуйте что-то вроде:

x1 = factor(df_nok$x, 
            levels=c("one", "two", "three", "four"), 
            labels=1:4)
df$x1 = as.numeric(x1)

Ответ 3

Добавьте в group эстетику (вроде избыточного, я знаю, но гораздо проще, чем перетаскивание меток оси).

df_nok <- rbind(data.frame(x=c("four","three","two","one"),y=rnorm(4),d="d1"),data.frame(x=c("three","two","one"),y=rnorm(3),d="d2"))

ggplot(df_nok, aes(x,y, group=d)) + geom_line(aes(colour=d))

Истинно, ваша ось x по-прежнему, вероятно, не в том порядке, в котором вы хотите. Как отметил @csgillespie, вы можете исправить это, превратив его в фактор

df_nok$x <- factor(df_nok$x, 
            levels=c("one", "two", "three", "four"), 
            labels=1:4)