1. 引子
前两天还说 R 语言不是不好,(只是不适合咱用)[],今天就想收回这话了。这货用着也太别扭了,一个最简单的可视化差点憋死我。
就像马保国,名气大,实则很完蛋。
2. 问题
比如一个最简单的csv,想打印成 Bar Plot。数据长的像下面这样
skills | number |
machine learning | 7255 |
communication skill | 2970 |
fast pace | 1672 |
software develop | 1356 |
track record | 1079 |
deep learning | 1065 |
project management | 1047 |
natural language | 958 |
data mining | 939 |
written communication | 926 |
再简单不过的一个表格,想按照上面顺序打印出来。于是导入以后调用 ggplot2 开始可视化
library(ggplot2)
sdata = read.csv('skills.csv')
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=n)) +
theme(axis.text.x = element_text(angle = 90)) + coord_flip()
但就这么简单个东西,问题就出来了,打印结果如下
不对吖,不应该是按照我数据的顺序打印么?这算怎么回事儿?仔细一看,丫的自作主张给我按照字母顺序排序打印了。
自作多情。谁稀罕你的排序啊。我就纳闷了,有多少次我们打印会按照字母顺序?直接按我原始数据指定的打印不好么?看 Python 多听话
import pandas as pd
import matplotlib.pyplot as plt
sdata = pd.read_csv("skills.csv", skipinitialspace=True)
plt.style.use('ggplot')
plt.barh(y=sdata.skills, width=sdata.numbers)
plt.xticks(rotation=90)
plt.gca().invert_yaxis()
结果
3. 分析
上网搜了一下,有的文章说是因为dataframe把categorical data转换成了factor,然后按照factor的order打印的。那我们把factor转换成vector是不是就可以了?
试试
sdata = read.csv('skills.csv')
sdata$skills = as.character(sdata$skills)
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=numbers)) +
theme(axis.text.x = element_text(angle = 90)) + coord_flip()
很遗憾,结果和之前一模一样
所以,应该是 R 在处理坐标轴排序的时候就是用的字母顺序,和factor还是vector没有关系。这个设计真是脑残。
既然想保持固定顺序,我们最后还是得回到能排序的东西上来。仔细看了看各种数据类型,也还是得靠facto。不管是它的 level属性,还是它的ordered属性,都是指定顺序的。指定level的时候,需要重新修改一下原来的column
sdata = read.csv('skills.csv')
s = as.character(sdata$skills)
sdata$skills = factor(s, levels = rev(s))
ggplot(data=sdata) + geom_col(mapping = aes(x=skills, y=numbers)) +
theme(axis.text.x = element_text(angle = 90)) + coord_flip()
这回终于一切正常了
4. 总结
这两天用 R,各方面都很怪异。作为被Python惯坏的东哥,实在有点伺候不了这个性格怪异的家伙。
上网大致搜了一下,R 第一版发布于1993年,前驱的 S语言则发布于1976年,算是上古语言了。Python则发布于1990年,没有前驱语言;其计算包 NumPy 发布于1995年,分析包pandas发布于2008年。
这就是先发优势吧。虽然Python优雅简洁,奈何R语言已经在统计和科学计算方面有了统治级别的地位。想一时半会儿取而代之,还是颇有难度。尤其在学界。
但我是真有点受够她了。人生苦短,我为啥不用 Python。
5. 参考文献
- Dr. P. Prakash和A. S. K. Rao, R Data Structures and Algorithms. 2016.
- H. Wickham和G. Grolemund, R for data science: import, tidy, transform, visualize, and model data, First edition. Sebastopol, CA: O’Reilly, 2016.