【问题标题】:X axis with ggplot2 not sequentialX轴与ggplot2不连续
【发布时间】:2016-05-10 21:31:12
【问题描述】:

我有一个小数据集,我在下面复制了它。它在行中有客户,在列中有每月的数量。两周前我正在使用 ggplot2 绘制它,并且效果很好。但是现在,时间段(x 轴)没有正确排序。期间“P_10”在“P_1”之后,应该是“P_2”。

前几行创建的数据与我的真实数据格式相同,所以我不想创建不同的数据。

我的第一个问题是:为什么这两周前有效,而现在却无效?上周更新了几个包,我猜有些改变了。

其次,(更重要的是)我该如何解决这个问题?

library(dplyr)
library(tidyr)
library(ggplot2)

# create data
a = paste("p_",1:20,sep = "")
b = paste("c",1:6,sep = "")
mydata2 = data.frame(matrix(rnorm(20),6,20))
names(mydata2) = a
mydata2$cust = b
mydata2 = mydata2[,c(ncol(mydata2),1:(ncol(mydata2)-1))]

# plot data
p_data = mydata2 %>% gather(period,Qty,-cust)

pl=(ggplot(data=p_data,aes(x=period,y=Qty,group=cust,colour=cust)) +
    geom_line(size=.4))

# display plot
pl

【问题讨论】:

  • 看起来你的 x 变量是一个因素。
  • 当我绘制您的数据时,x 轴按 p_1、p_2、... p_20 排序,所以这是您想要的结果? ggplot2 版本为 2.0.0
  • 我也在使用 ggplot2 2.0.0,虽然句点列是 character,但我可以重现错误排序的 x 轴。
  • 嗨,我正在使用 ggplot 2.0.0(自 12 月下旬以来)。我使用了几个包(并欣赏它们!),也许另一个包中的更新改变了数据呈现给 ggplot2 的方式?感谢您的帮助!

标签: r plot ggplot2 time-series dplyr


【解决方案1】:

至于你的第一个问题,运行sort 时答案就很明显了。数据第二列中的单个条目按升序排序,因此“p_10”、“p_11”等出现在“p_2”、“p_3”等之前。

unique(sort(p_data[, 2]))
 [1] "p_1"  "p_10" "p_11" "p_12" "p_13" "p_14" "p_15" "p_16" "p_17" "p_18" "p_19" "p_2"  "p_20" "p_3"  "p_4"  "p_5"  "p_6" 
[18] "p_7"  "p_8"  "p_9" 

至于您的第二个问题,我建议您将数据的第二列简单地转换为“因子”。根据我的经验,ggplot 在使用 'factor' 而不是 'character' 变量时更容易处理,其中包括此类排序问题。请记住手动定义所需的因子标签。否则,您将再次在 x 轴上出现 'p_1'、'p_10'、'p_11' 等。

p_data[, 2] <- factor(p_data[, 2], levels = unique(p_data[, 2]))

ggplot(data = p_data, aes(x = period, y = Qty, group = cust, colour = cust)) +
      geom_line(size = .4)

【讨论】:

  • 谢谢,转换为因子解决了这个问题。我仍然很好奇为什么它会成为一个问题。几周前,我运行了相同的代码,产生了很好的情节。但是,重要的是(对我而言)它有效并且我可以继续工作。
【解决方案2】:

您还可以使用因子并对因子的水平进行排序。不是说这比其他答案更好,只是另一种方式!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2012-08-21
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多