c++ 根据点组绘制图形_R语言统计与绘图:绘制直方图

cc2effaa52f2fa183ea118daaed951d4.png

我们无论在何时分析数据,第一件要做的事情就是观察它。对于每个变量,哪些值是最常见的?值域是大是小?是否有不寻常的观测?R中提供了丰富的数据可视化函数。

直方图通过在x轴上将值域分割为一定数量的组,在y轴上显示相应值的频数,展示了连续型变量的分布。

今天来学习绘制直方图。


目  录

  • 1. 加载数据集

  • 2. 简单茎叶图

  • 3. 简单直方图

  • 4. 美化图形

  • 5. 添加正态分布曲线

  • 6. 复杂直方图

    • 6.1 堆叠直方图

    • 6.2 非堆叠直方图

  • 7. lattice绘制直方图

  • 8. hist()函数

  • 9. histStack()函数

  • 10. Hist()函数


1. 加载数据集

本篇推文选用的是multcomp包的sbp数据集。

install.packages("multcomp") # 安装包
library(multcomp) # 加载包
data(sbp) # 加载内置数据集
View(sbp) # 预览数据集
daaf33d7d513a1aca7f9bcc997a0ee3e.png

数据集包括3个变量(收缩压、年龄、性别),共69个观测对象。

2. 简单茎叶图

我们先绘制个茎叶图来观察血压的分布,使用stem()函数来绘制茎叶图。

stem(sbp$sbp)
f506fd28a347d8c56cc2c4e150dcc06f.png

图上显示了数据集中所有的血压,血压都是三位数字,茎叶图的主干包含2位数字,图上左边的两位数字表示主干,"叶"包含每个数字的最后一位数字。第一行的3个数字为110、114、116。

图上血压分布基本近似对称,低血压患者数量和高血压患者数量大致相同。

stem(sbp$sbp, scale = 2) # 改变茎宽
bbd911745980e881dc2857c46adc63a1.png

3. 简单直方图

我们先来绘制简单的直方图。

attach(sbp)
par(mfrow = c(2,2))
hist(sbp$sbp, main = "a. R自行确定断点")
hist(sbp$sbp, main = "b. 自定义四个特定点",
     breaks = c(110,135,160,185))
hist(sbp$sbp, main = "c. 自定义断点的数目",
     breaks = 30) 
hist(sbp$sbp, main = "d. 设置断点的起始点和终点",
     breaks = seq(110,190,15))
detach(sbp)
2b1ba0d9ad8656155e9a85db344a8a64.png

4. 美化图形

自定义一些参数来美化图形。

hist(sbp$sbp, # 绘图数据
     main = "sbp dataset", # 设置图形标题 
     las = 1,  # 翻转y轴上面的数字,使其直立而不是侧立
     label = T, # 直方图上面添加数据标签
     col = "maroon",  # 设置直方图颜色
     xlab = "Systolic blood pressure") # 添加x轴标签
558cc9ad529bf2ba7c8be7d13506cc41.png

5. 添加正态分布曲线

x # 将绘图数据传递给x
h # 绘图数据
          main = "sbp dataset", # 设置图形标题 
          las = 1,  # 翻转y轴上面的数字,使其直立而不是侧立
          label = T, # 直方图上面添加数据标签
          col = "maroon",  # 设置直方图颜色
          ylim = c(0,16), # 设置y轴范围
          xlab = "Systolic blood pressure") # 添加x轴标签
xfit40)
yfityfit 1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2) # 添加正态分布曲线
box() # 图形周围加个框框
071a881d05d70c0acc49559d2a77cb06.png

6. 复杂直方图

6.1 堆叠直方图

在上面的数据集中,有时候我们需要研究性别与收缩压之间的关系,想知道不同性别之间的血压分布是否相似还是不同。我们可以使用堆叠的直方图来显示数据分布,plotrix包的histStack()函数实现。

library(plotrix) # 加载包
library(multcomp) # 加载包
histStack(sbp$sbp, # 绘图数据
          z = sbp$gender, # 分组变量
          col=c("navy","skyblue"), # 设置直方图颜色
          main = "Systolic blood pressure by gender", # 设置标题
          xlab = "Systolic blood pressure",  # 设置x轴标签
          legend.pos = "topright") # 设置图例位置
10601a60bf2b6b3abb398333bc775feb.png

6.2 非堆叠直方图

如果我们不想使用堆叠的方式显示直方图,可以使用并排或者分开的方式排布。

可以使用RCmdrMisc包的Hist()函数来实现。

install.packages("RcmdrMisc") # 安装包
library(RcmdrMisc) # 加载包
library(multcomp) # 加载包
Hist(sbp$sbp,  # 绘图数据
     groups = sbp$gender, # 分组数据
     main = "Systolic blood pressure by gender", # 添加标题
     col = "navy ", # 设置颜色
     xlab = "Systolic blood pressure") # 设置x轴标签
b68696d6f44e49f2a67811f7e28d9b76.png

如上图所示,我们可以看出男性血压整体要比女性高些。

7. lattice绘制直方图

Hist()函数适用于少量的分组,当分组数量很大就不是很方便了,此时可以使用lattice包来绘制图形。

car包的Salaries数据集包含了2008-2009年美国一所大学教授们的9个月薪水数据,可以用来比较男性与女性薪水之间的差异。

install.packages("lattice") # 安装包 
install.packages("car") # 安装包
library(lattice) # 加载包
library(car) # 加载包
head(Salaries) # 显示数据集前6行
4f45e91a4f83b81504f75ecd44c39b6f.png

数据集中包含了等级(rank)和性别(sex)两个分组变量,还有薪水这个连续变量,现在根据这两个分组变量来生成一组直方图。

histogram(~ Salaries$salary | Salaries$rank * Salaries$sex,
          type = "count", main = "Faculty Salaries by Rank & Gender")
536ce30f24f2fd2e97a183a9bf1fd749.png

如上图所示,我们试着分析以下上面的数据,首先,图形上面为男性,下面为女性,可以知道研究数据集中男性数量比女性要多;

图形左边为副教授或助理教授,右边为教授,数据集中教授人数又要多很多。

最后看薪水,各个职位的男性和女性的薪水分布的中位数差不多,但在教授和副教授中,男性薪水最高。

8. hist()函数

hist(x, breaks = "Sturges",
     freq = NULL, probability = !freq,
     include.lowest = TRUE, right = TRUE,
     density = NULL, angle = 45, col = "lightgray", border = NULL,
     main = paste("Histogram of" , xname),
     xlim = range(breaks), ylim = NULL,
     xlab = xname, ylab,
     axes = TRUE, plot = TRUE, labels = FALSE,
     nclass = NULL, warn.unused = TRUE, ...)

## 部分参数解释
x # 用来绘制直方图的数字向量
breaks # 规定直方图的组距
# 可以为向量,用来定义直方图条形之间的断点
# 也可以是函数,用来计算断点向量
# 也可以直接就是一个数值,用来表示条形的数量
freq # 逻辑词,如为TRUE,则绘制频率分布直方图;
# 如为FALSE,则绘制概率密度、成分密度直方图
right # 逻辑词,如为TRUE,则直方图为左开右闭区间
density # 数字,表示直方图中阴影线的密度,默认不绘制阴影线
angle # 阴影线的斜率,用度数表示
col # 填充直方图的颜色,默认不填充颜色
border # 直方图边框的颜色
main # 图形标题
xlim、ylim # 限制x轴和y轴的范围
xlab、ylab # 指定x轴和y轴的标签
axes # 逻辑词,如为TRUE,则绘制坐标轴
labels # 逻辑词和字符串,在直方图上面添加数据标签

9. histStack()函数

histStack(x,z,breaks="Sturges",col="rainbow",
          right=TRUE,main="",xlab=NULL,legend.pos=NULL,cex.legend=0.75,...)

## 部分参数解释
x # 用来绘图的定量数据
z # 指定分类变量,用来绘制堆叠直方图
breaks # 设置x值断点的数目
col # 设置图形的颜色,可以是字符串,也可以是包含颜色的向量;
right # 逻辑词,指定直方图数据右边是开区间还是闭区间
main # 指定图形标题的字符串
xlab # 指定x轴标签的字符串
legend.pos # 指定图例的位置
cex.legend # 指定图例的大小

10. Hist()函数

基于base包中hist()函数的封装,功能更为强大。

Hist(x, groups, scale=c("frequency", "percent", "density"), xlab=deparse(substitute(x)), 
     ylab=scale, main="", breaks = "Sturges", ...)

## 部分参数解释
x # 要绘制直方图的数字向量
groups # 分组创建直方图的因子
scale # 垂直轴的缩放比例:频率(默认);百分比;密度。
xlab,ylab,main # x轴、y轴标签、图形标题
breaks # 设置x轴断点
参考资料
  1. Graphing Data with R. John Jay Hilfiger著
  2. [美]Robert I. Kabacoff著. R语言实战(第2版)[M].王小宁等译. 北京:人民邮电出出版社.2016.
  3. hist()函数帮助文件
  4. histStack()函数帮助文件
  5. Hist()函数帮助文件

相关文章

这个浏览器插件可以智能查询SCI论文被引情况

R语言统计与绘图:ROC曲线上32种截断值的计算

R语言统计与绘图:ROC曲线的统计计算

R语言统计与绘图:可视化ROC曲线的置信区间

R语言统计与绘图:绘制平滑ROC曲线

R语言统计与绘图:绘制不同坐标轴置信区间的森林图

R语言统计与绘图:绘制多个置信区间的森林图

9c570e6957f8a0171b038f7e8a602b57.png

分享、点赞、在看,一键三连!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值