这年头没有火眼金睛,不敢教R语言了

问题背景

https://mp.weixin.qq.com/s/DFIwVwrgN4s-FK4WjWuO3Q

在这一篇推文里,我写了怎么正确显示坐标轴顺序。

不调整的话横坐标默认是这样:



调整正确的是这样:


然而有位学员搬砖的时候报了错。

示例流程

1.生成示例数据

if(!require(tidyr)) install.packages("tidyr")
#> Loading required package: tidyr
library(tidyr)

x=matrix(rnorm(2200,mean=1.5,sd = 0.2),ncol = 22)
test=as.data.frame(x)
colnames(test)=paste0("chr",1:22)
test2 <- gather(test,key = "chr",value = "values")
head(test2,3)
#>    chr   values
#> 1 chr1 1.173558
#> 2 chr1 1.749868
#> 3 chr1 1.374387
table(test2$chr)
#> 
#>  chr1 chr10 chr11 chr12 chr13 chr14 chr15 chr16 chr17 chr18 chr19  chr2 
#>   100   100   100   100   100   100   100   100   100   100   100   100 
#> chr20 chr21 chr22  chr3  chr4  chr5  chr6  chr7  chr8  chr9 
#>   100   100   100   100   100   100   100   100   100   100

2.调整横轴对应列的顺序

关键代码是:

test2$chr <- factor(test2$chr,levels=paste0("chr",1:22),ordered = TRUE)

3.出图

顺利做出了正确的图

if(!require(ggplot2))install.packages("ggplot2")
#> Loading required package: ggplot2
library(ggplot2)
p1 <- ggplot(test2,aes(x = chr, y = values)) + 
  geom_boxplot()+
  theme_bw()+
  theme(axis.text.x = element_text(angle=50,vjust = 0.5))
p1

翻车现场

这么简单的代码,发生了报错。

错误代码

options(stringsAsFactors = F)
a <-data.frame(case=paste("S",c(1:50)),values=runif(50)) 
a$case <- factor(a$case,levels=paste0("S",1:50),ordered = TRUE)
plot(a$case,a$values)

warning和报错信息

#> Warning in min(x): no non-missing arguments to min; returning Inf
#> Warning in max(x): no non-missing arguments to max; returning -Inf
#> Error in plot.window(xlim = xlim, ylim = ylim, log = log, yaxs = pars$yaxs): need finite 'ylim' values

有报错,请搜索

直接复制到必应搜索,可以看到这个链接:
https://stackoverflow.com/questions/21349368/error-in-plot-window-need-finite-xlim-values

总结一下答案的意思,其实就是数据全是NA。一检查,果不其然,全是NA。

a$case
#>  [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> [15] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> [29] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> [43] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 50 Levels: S1 < S2 < S3 < S4 < S5 < S6 < S7 < S8 < S9 < S10 < ... < S50

为何都是NA

这样一个简单的报错竟然花了我十几分钟时间去解决,我先后测试了这个数据有没有问题,分别用ggplot2和plot作图,plot支不支持因子型数据,然后又看了因子水平是不是不能有空格。

(叫苦不迭,我根本没有学过基础包作图,我是直接学的ggplot2啊啊啊啊,而且因子挖的坑,早就被哈德雷叔叔填平了,如果不是在后面的教学中必须要讲基础包,我可能碰都不碰它。)

火眼金睛

全是NA的原因非常简单,因子水平和内容完全不对应,内容用的函数是paste,水平用的函数却成了paste0。

paste0("S",1:50)
#>  [1] "S1"  "S2"  "S3"  "S4"  "S5"  "S6"  "S7"  "S8"  "S9"  "S10" "S11"
#> [12] "S12" "S13" "S14" "S15" "S16" "S17" "S18" "S19" "S20" "S21" "S22"
#> [23] "S23" "S24" "S25" "S26" "S27" "S28" "S29" "S30" "S31" "S32" "S33"
#> [34] "S34" "S35" "S36" "S37" "S38" "S39" "S40" "S41" "S42" "S43" "S44"
#> [45] "S45" "S46" "S47" "S48" "S49" "S50"
paste("S",1:50)
#>  [1] "S 1"  "S 2"  "S 3"  "S 4"  "S 5"  "S 6"  "S 7"  "S 8"  "S 9"  "S 10"
#> [11] "S 11" "S 12" "S 13" "S 14" "S 15" "S 16" "S 17" "S 18" "S 19" "S 20"
#> [21] "S 21" "S 22" "S 23" "S 24" "S 25" "S 26" "S 27" "S 28" "S 29" "S 30"
#> [31] "S 31" "S 32" "S 33" "S 34" "S 35" "S 36" "S 37" "S 38" "S 39" "S 40"
#> [41] "S 41" "S 42" "S 43" "S 44" "S 45" "S 46" "S 47" "S 48" "S 49" "S 50"

改正

其实想让这个代码正确运行异常简单,就加一个零而已。

a<-data.frame(case=paste0("S",c(1:50)),values=runif(50)) 
a$case <- factor(a$case,levels=paste0("S",1:50),ordered = TRUE)
plot(a$case,a$values)

后记

对于新手来说很多细微的小错误,却是越不过去的大坎。当你回过头去看看,会发现曾经的错误其实特别简单。

看别人的错误代码真要命啊。前面写paste,后面写paste0。虽然单独拿出来都没错,但是凑在一起就不对了。

/(ㄒoㄒ)/~~

如果一个人愿意花时间帮你找你写的代码报错原因,那。。。她心情一定很好。

看完这代码,心情怎么样就不一定了。比如我现在就想暴走。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容