画因子型日期的点画线时存在的问题

王致远

2018/11/08

今天在画因子型日期的点画线时遇到了两个问题。

数据如下:

head(xzyk_mds[c("md","cars")],10)
##       md  cars
## 1   10-1 52356
## 2   10-2 53108
## 3   10-3 53738
## 4   10-4 50594
## 5   10-5 50012
## 6   10-6 49111
## 7   10-7 49118
## 8   10-8 49744
## 9   10-9 49855
## 10 10-10 48507

其中md为有序因子

str(xzyk_mds$md)
##  Ord.factor w/ 37 levels "10-1"<"10-10"<..: 1 12 23 26 27 28 29 30 31 2 ...

第一个问题是画点化线时,线画不出来。

ggplot(data = xzyk_mds,aes(x=md,y=cars))+
  geom_point(color="steelblue")+
  geom_line(color="steelblue")
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?

提示信息说是在调用geom_path函数时,指定group有问题,每一个group里只有一个观测,需要调整group的映射。我就奇了怪了,以前从来没遇到这个问题。我查了之前的博客因子的顺序,发现之前是指定了特定的group的。难道是如果不指定,就会认为每个因子是一个分组?

我做了如下尝试,将一个无关变量(全部相同的)指定给group,果然能画出点画线了。

ggplot(data = xzyk_mds,aes(x=md,y=cars))+
  geom_point(color="steelblue")+
  geom_line(group=xzyk_mds$province,color="steelblue")

又进行了尝试,给group随便赋值,也是可以的。

ggplot(data = xzyk_mds,aes(x=md,y=cars))+
  geom_point(color="steelblue")+
  geom_line(group=1,color="steelblue")

第二个问题是银子的顺序是乱的,可以看到10-2排在了10-10,10-11等等之后。

attributes(xzyk_mds$md)
## $levels
##  [1] "10-1"  "10-10" "10-11" "10-12" "10-13" "10-14" "10-15" "10-16"
##  [9] "10-17" "10-18" "10-19" "10-2"  "10-20" "10-21" "10-22" "10-23"
## [17] "10-24" "10-25" "10-26" "10-27" "10-28" "10-29" "10-3"  "10-30"
## [25] "10-31" "10-4"  "10-5"  "10-6"  "10-7"  "10-8"  "10-9"  "11-1" 
## [33] "11-2"  "11-3"  "11-4"  "11-5"  "11-6" 
## 
## $class
## [1] "ordered" "factor"
ggplot(data = xzyk_mds,aes(x=md,y=cars))+
  geom_point(color="steelblue")+
  geom_line(group=1,color="steelblue")+
  scale_x_discrete(breaks=xzyk_mds$md[seq(1,37,3)])+
  labs()

画出的图自然也是乱的

考虑到如果将其化为字符串型,顺序就对了

as.character(xzyk_mds$md)
##  [1] "10-1"  "10-2"  "10-3"  "10-4"  "10-5"  "10-6"  "10-7"  "10-8" 
##  [9] "10-9"  "10-10" "10-11" "10-12" "10-13" "10-14" "10-15" "10-16"
## [17] "10-17" "10-18" "10-19" "10-20" "10-21" "10-22" "10-23" "10-24"
## [25] "10-25" "10-26" "10-27" "10-28" "10-29" "10-30" "10-31" "11-1" 
## [33] "11-2"  "11-3"  "11-4"  "11-5"  "11-6"

所以对原因子做如下处理:

xzyk_mds$md <- factor(xzyk_mds$md,level=as.character(xzyk_mds$md),order=T)

再画图,顺序就对了

ggplot(data = xzyk_mds,aes(x=md,y=cars))+
  geom_point(color="steelblue")+
  geom_line(group=1,color="steelblue")+
  scale_x_discrete(breaks=xzyk_mds$md[seq(1,37,3)])+
  labs()