ggplot在x轴上使用字符串

时间:2012-05-08 09:21:45

标签: r plot ggplot2 dataframe

我正在尝试绘制一条带有几条曲线的情节。 x轴不是数值,而是字符串。

这很好用(例如在how to plot all the columns of a data frame in 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值)。

3 个答案:

答案 0 :(得分:19)

您的问题是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)

答案 1 :(得分:6)

您可以通过添加虚拟组来说服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/

答案 2 :(得分: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)