17

我正在尝试绘制一个包含多条曲线的图。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 值)。

4

3 回答 3

20

你的问题是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)
于 2012-05-08T10:42:12.323 回答
7

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

于 2012-05-08T09:25:34.450 回答
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)
于 2013-08-13T04:59:22.787 回答