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)
Ответ 2
Вы можете убедить ggplot рисовать линии, добавив фиктивную группу,
ggplot(df_nok, aes(x,y)) + geom_line(aes(colour=d, group=d))
Также см. http://kohske.wordpress.com/2010/12/27/faq-geom_line-doesnt-draw-lines/
Ответ 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)