如何制作一周中每日的直方图,并添加字符串标签

5

我有一个日期数据框(Date object)如下。

我想把它们转换为星期几,然后绘制直方图,但最好的情况是标签是“星期一”……“星期日”(而不是数字)

我有两个不同的问题:

  1. 把日期对象转换成星期几很容易 (参见链接),但结果是字符串或数字,而不是对象。
  2. 当我得到一个直方图时,柱和标签是错误的(如下所示)。

如果我使用weekdays(dat),输出是字符串("星期一"……),无法在hist()中使用。

另外,如果我将其转换为数值数据,如何在hist()中获取字符串标签?

> dotw <- with( month.day.year(dat[,1]), day.of.week(month,day,year) )
> hist(xxx,labels=c('M','Tu','W','Th','F','Sa','Su'),col='black') # WTF?!
> hist(dotw,xlab=list('M','Tu','W','Th','F','Sa','Su'))

无法正确标记。0.5宽度的箱子是什么意思?还有,如何防止星期天-> 0和星期一-> 1之间缺少间隙?理想情况下,列之间没有间隙。
我的数据长这样:
> dat
  [1] "2010-04-02" "2010-04-06" "2010-04-09" "2010-04-10" "2010-04-14" "2010-04-15" "2010-04-19"
  [8] "2010-04-21" "2010-04-22" "2010-04-23" "2010-04-26" "2010-04-28" "2010-04-29" "2010-04-30"
 ...

> str(dat)
 Date[1:146], format: "2010-04-02" "2010-04-06" "2010-04-09" "2010-04-10" "2010-04-14" "2010-04-15" ...

> str(weekdays(dat))
 chr [1:146] "Friday" "Tuesday" "Friday" "Saturday" "Wednesday" "Thursday" "Monday" ...
> hist(weekdays(dat))
Error in hist.default(weekdays(dat)) : 'x' must be numeric
3个回答

7
dat <- as.Date( c("2010-04-02", "2010-04-06", "2010-04-09", "2010-04-10", "2010-04-14", 
       "2010-04-15", "2010-04-19",   "2010-04-21", "2010-04-22", "2010-04-23","2010-04-24", 
        "2010-04-25", "2010-04-26", "2010-04-28", "2010-04-29", "2010-04-30"))
 dwka <- format(dat , "%a")
 dwka
# [1] "Fri" "Tue" "Fri" "Sat" "Wed" "Thu" "Mon"
#  [8] "Wed" "Thu" "Fri" "Sat" "Sun" "Mon" "Wed"
# [15] "Thu" "Fri"
dwkn <- as.numeric( format(dat , "%w") ) # numeric version
hist( dwkn , breaks= -.5+0:7, labels= unique(dwka[order(dwkn)]))

enter image description here


美妙,谢谢!太好了,应该内置!(我没有预料到在整数数据的0.5处使用breaks,这真的应该是内置的,并且可以防止虚假的半宽条形图。) - smci

4
我猜您想要绘制条形图而不是直方图。您可以使用“表格”来计算天数。
barplot(table(weekdays(dat)))

请注意,默认情况下,日期将按字母顺序排序,因此要更自然地排序,您需要在因子调用中重新排序级别:

barplot(table(factor(weekdays(dat),levels=c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"))))

3

weekdays(dat)转换为因子(用于分类变量的数据类型),并取消分类(将其转换为整数)以进行直方图制作。因子类上有一些操作,可使自定义x轴变得简单。

## days of the week
days <- c('Sun','Mon','Tues','Wed','Thurs','Fri','Sat')

## sample with replacement to generate data for this example
samples <- sample(days,100,replace=TRUE)

## convert to factor
## specify levels to specify the order
samples <- factor(samples,levels=days)

hist(unclass(samples),xaxt="n")
axis(1,at=1:nlevels(samples),lab=levels(samples))
box()

好的,为什么我的方法会得到0.5宽度的条形桶,0('星期天')和1('星期一')之间没有间隔,以及不匹配的0.5标签?这是由于使用了hist(labels=c('M','Tu','W','Th','F','Sa','Su'))导致的。 - smci
hist函数有一个宽度参数来控制条形图的宽度;如果想要更完全地控制坐标轴的外观,可以在hist中设置xaxt="n",然后使用axis自己绘制。 - hatmatrix
请注意,hist是一个通用函数,它根据您提供的第一个参数的类别执行不同的操作。因此,这取决于您示例中的xxxdotw是什么。 - hatmatrix
我在问题中写的是:dat 是一个日期对象的数据框。dotw 是由所示代码计算出的整数(0..6)。 - smci
这也非常有帮助,谢谢。很抱歉只能选择一个。 - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接