【问题标题】:ggplot with Strings on x-Axisx轴上带有字符串的ggplot
【发布时间】:2012-05-16 18:38:08
【问题描述】:

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

【问题讨论】:

    标签: r plot ggplot2 dataframe


    【解决方案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)
    

    【讨论】:

    • 我希望不必重塑我的数据。但是如果没有其他人有想法,我会接受这个答案。
    • 当我得到df_nokx 的通缉订单时,您知道如何轻松地将我的数据重塑为这种形式吗?
    • 如果可以的话,我会投票给你十个。必须永远记住as.is=TRUE!第二个问题是设置as.is=TRUE 后的日期是字符引起的,但这很容易通过as.Date() 解决。
    • 你不只是喜欢 R 和 Stack Overflow 吗?太棒了!
    【解决方案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/

    【讨论】:

    • 这不能正常工作。它用彩色线段绘制一条线,但不是两条单独的线。
    • 应该是group=d,而不是group=1
    • 好东西!现在只有顺序是错误的(“四”、“一”、“三”、“二”)。有什么快速帮助吗?
    • 对不起,我读得太快了,很高兴你得到了更好的答案。 PS:可以通过将x 设置为您希望它们显示的顺序的级别来更改顺序。
    • @baptiste:但它适用于 Brian Diggs 上面评论的技巧(排序顺序除外)!在上方编辑您的答案并获得支持!
    【解决方案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)
    

    【讨论】:

    • 晚一年总比没有好,对吧?好吧,无论如何,这将是为像我这样的人在未来偶然发现的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多