【问题标题】:Reordering a character column values for plotting重新排序字符列值以进行绘图
【发布时间】:2013-03-16 17:46:59
【问题描述】:

以下是我拥有的数据框的一个子集:

sample <- structure(list(MONTH_DAY = c("1_0", "1_1", "1_10", "1_11", "1_12", 
"1_13", "1_14", "1_15", "1_16", "1_17", "1_18", "1_19", "1_2", 
"1_20", "1_21", "1_22", "1_23", "1_3", "1_4", "1_5", "1_6", "1_7", 
"1_8", "1_9", "2_0", "2_1", "2_10", "2_11", "2_12", "2_13", "2_14", 
"2_15", "2_16", "2_17", "2_18", "2_19", "2_2", "2_20", "2_21", 
"2_22", "2_23", "2_3", "2_4", "2_5", "2_6", "2_7", "2_8", "2_9", 
"3_0", "3_1"), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("9", 
"10", "11", "12", "13"), class = "factor"), value = c(NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 51, 18
)), .Names = c("MONTH_DAY", "variable", "value"), row.names = c(NA, 
50L), class = "data.frame")

我正在使用ggplot2 绘制图表,x 轴的格式为 MONTH_DAYOFMONTH,即 1_13 表示同月的 1 月和 13 日,y 轴表示计数(数据框中的 value 列)。当我绘制数据时,使用命令:

ggplot(sampleData, aes(x=MONTH_DAY, y=value, colour=variable, group=variable)) + `geom_line() + theme(axis.text.x=element_text(angle=90, size=4, hjust=-0.2, vjust=0.5)) + scale_colour_discrete("Months")`

x 轴未排序并显示以 x 轴值为 1_0, 1_1, 1_10, 1_11 ... 而不是 1_0, 1_1, 1_2, 1_3 的开头。

如何对这些值进行排序,以便图表显示数据是我希望看到的顺序?

【问题讨论】:

  • 这在概念上与您提出的另一个问题有关:stackoverflow.com/q/15370042/1270695。在那里查看我的 cmets 以解决您的主要问题。
  • 我会将MONTH_DAY 转换为一个因子,使用factor(),在levels 参数中提供所需的顺序。
  • 1_0 是几月几日?
  • @SimonO101:抱歉,我取了一个旧数据框的子集,其中有一个错误,即从当月的日期中减去 1。显然,这不会改变问题的基础,即排序)
  • @articSnail 不,但是,我想你可以使用sampleData$MONTH_DAY &lt;- as.Date( sampleData$MONTH_DAY , format = "%m_%d ),当日期不存在时,它会给出 NA。

标签: r ggplot2 dataframe


【解决方案1】:

试试mixedsort,来自 gtools 包:

library(gtools)
sample$MONTH_DAY <- 
    with(sample, ordered(MONTH_DAY, levels=mixedsort(MONTH_DAY)))
## Try your plotting code here

为了说明它的作用:

MONTH_DAY = c("1_0", "1_1", "1_10", "1_11", "1_12", 
"1_13", "1_14", "1_15", "1_16", "1_17", "1_18", "1_19", "1_2", 
"1_20", "1_21", "1_22", "1_23", "1_3", "1_4", "1_5", "1_6", "1_7", 
"1_8", "1_9", "2_0", "2_1", "2_10", "2_11", "2_12", "2_13", "2_14", 
"2_15", "2_16", "2_17", "2_18", "2_19", "2_2", "2_20", "2_21", 
"2_22", "2_23", "2_3", "2_4", "2_5", "2_6", "2_7", "2_8", "2_9", 
"3_0", "3_1")

head(sort(MONTH_DAY), 10)
#  [1] "1_0"  "1_1"  "1_10" "1_11" "1_12" "1_13" "1_14" "1_15" "1_16" "1_17"

head(mixedsort(MONTH_DAY), 10)
#  [1] "1_0" "1_1" "1_2" "1_3" "1_4" "1_5" "1_6" "1_7" "1_8" "1_9"

【讨论】:

    【解决方案2】:

    我只是把它变成一个日期并像这样绘制它(注意,在你给所有值的数据中,第二条是NA所以我使用runif(50 , max = 50)做了一些值...

    sampleData$MONTH_DAY <- as.Date( sampleData$MONTH_DAY , format = "%m_%d" )
    ggplot(sampleData, aes(x=MONTH_DAY, y=value, colour=variable, group=variable)) + 
    geom_line() +
    theme(axis.text.x=element_text(angle=90, size=4, hjust=-0.2, vjust=0.5)) +        
    scale_colour_discrete("Months")
    

    【讨论】:

      猜你喜欢
      • 2021-10-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2015-04-07
      • 2020-04-29
      相关资源
      最近更新 更多