零基础的话先看:


西瓜霜:R语言之【从安装说起&遇到问题怎么办】zhuanlan.zhihu.com


西瓜霜:R语言之【基础必备代码】zhuanlan.zhihu.com


西瓜霜:R语言之【数据管理及处理】zhuanlan.zhihu.com



没装ggplot2的先安装。



install.packages("ggplot2")
library(ggplot2)



数据是2016年全国举办过的马拉松比赛的列表(下面是下载链接)。




R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言ggplot2移除图例

https://github.com/bctclc/sample_data_for_R_viz/blob/master/2016marathon.csv

导入数据。



setwd("C:Users***")
marathon <- read.csv("2016marathon.csv", stringsAsFactors = FALSE)



这个数据当然有很多种做法,比较自然的做法可能是根据月份来统计,看哪些月份马拉松比赛更多(盲猜春秋,感觉天气会比较好一点)。结果↓




R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言ggplot2移除图例_02


可视化最最重要的第一步其实是清洗数据,数据不干净最后都会反映在最后真正执行可视化的那几行代码中——会需要加补丁一样地加很多限制条件或者微调一下数据格式等等。这样比较容易出bug,之后看也觉得绕,所以比较建议写短代码每一句完成一个明确的功能。没人喜欢GRE长难句!


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_r语言径向柱状图_03


这个数据总体还是干净的,但拉到最后会发现有加一行来源和备注。加上空了一行,所以最后两行其实都不是我要可视化的数据,需要删掉,也就是保留第1行到第318行。


marathon <- marathon[1:318, ]


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言ggplot2移除图例_04


这个数据这样就算清理好了。直接上可视化代码。


ggplot(marathon, aes(x=month))+
  geom_bar(stat="count")


第一行还是选择数据,但相对特别是在aes后面只明确了横轴的变量,没有明确纵轴用的变量——纵轴用的其实是一个隐含变量,即条目本身都代表1. 因此,在geom_bar里加上了stat="count", 其实就是说要R自己去数一下每个月的条目数量,然后再可视化出来。


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言堆叠占比柱状图_05


这张图乍一看没什么问题,但仔细看会发现下面的月份是乱序的。你要是不讲究,自己用图来看个大概是没什么问题,但要是用这张图去给别人展示的话,就有点过分不讲究了。

其实R还是聪明的,如果是数值型变量,在可视化里是会按照大小排序的(从小到大),但因为导入数据的时候这一列下面还有出处和备注(是文本型变量),这一整列就被识别为文本型变量了。这时候可视化的结果里,排序是按照出现顺序排的。如果你不确定某一列到底是什么变量,就用class来查询。


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言堆叠占比柱状图_06


改变变量类型也很容易。


marathon$month <- as.numeric(marathon$month) #改成数值型变量
marathon$month <- as.character(marathon$month) #改成文本型变量


用上面那句把month改成数值型变量以后再跑一遍ggplot那句,出来的结果就不是乱序的了。


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言ggplot2移除图例_02


----------------------------------且慢------------------------------

其实上面这种数据类型在日常中出现的几率并没有很高,更多的是已经统计好的结果数据,比如这样。


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_r语言变量长度不一致怎么办_08


这种时候也很简单,只要在之前用的代码中改两个小地方就可以了。一个是现在有纵轴的变量了,那就要跟R明确一下y=count; 第二,stat="count"是告诉R要自己先做个加总,stat="identity"则是说用现成的数据就可以了。(stat_marathon是上面那个表格的名称。)


ggplot(stat_marathon, aes(x=month, y=count))+
  geom_bar(stat="identity")


R语言 ggplot 图例分组 r语言ggplot2手动添加图例_R语言ggplot2移除图例_02


出来的结果是一模一样的(我真的有跑不同的代码)。

---------------------怎么在R里把个案数据转化成统计结果-------------------

第一行,新赋值一个变量。这个变量叫什么你可以自己取名,我这里就是叫count, 每一行的数值都是1,就是说每一行就代表一个案例(听上去很废话,但用起来不是)。

第二行比较复杂,是要用原来的表格生成统计结果。这个功能是自带的,不需要另外安装程序包。在aggregate之后主要分三个部分。第一部分就是统计的规则,~之前的是用来统计的变量,只能写一个;~后是分组变量,可以写多个,假如说我要统计2016年每天马拉松比赛的数量,那~之后就写month+date. 第二部分很明确,就是要用的个案数据。第三部分就是算法,sum就是全部加起来,另一个常用的是mean,即求平均值。


marathon$count <- 1
stat_marathon <- aggregate(count~month, data=marathon, sum)


没了。