R语言基础| 基本图形绘制

写在前面

ggplot2 是一个基于 R 语言的数据可视化包,提供了一种结构化的方法来描述和构建图表,因此被广泛用于制作可视化图表。其是tidyverse数据科学生态系统的一部分。

在 ggplot2 中,每一个图形都是从数据映射到美学属性(如颜色、形状和大小)、加上几何对象(如点、线和条形图)、统计变换和坐标系等元素组合而成。这种分层和模块化的方法使得用户可以灵活地创建复杂的图表,同时保持代码的可读性和易用性。通过ggplot2,你可以创建各种图表:包括但不限于散点图、线图、直方图、条形图和箱线图。此外,ggplot2 提供了广泛的自定义选项,允许用户调整几乎图表的每个细节,以适应具体的展示需求。

简而言之,ggplot2 是 R 语言中一个功能强大且灵活的数据可视化工具。因此,本文主要学习如何在R语言中通过ggplot2来绘制条形图、堆积图、饼图、直方图、核密度图、箱图、小提琴图。

完整R语言教程和测试数据可见:R语言基础学习手册

复制代码
6.1 条形图

以 vcd 包中的Arthritis数据框为例:

复制代码
install.packages("vcd")

读取该数据框,使用函数为:

复制代码
data_frame <- package_name::data_frame_name

library(vcd)
library(grid)
Arthritis <- vcd::Arthritis
Arthritis

##    ID Treatment    Sex Age Improved
## 1  57   Treated   Male  27     Some
## 2  46   Treated   Male  29     None
## 3  77   Treated   Male  30     None
## 4  17   Treated   Male  32   Marked
## 5  36   Treated   Male  46   Marked
## 6  23   Treated   Male  58   Marked
## 7  75   Treated   Male  59     None
## 8  39   Treated   Male  59   Marked
## 9  33   Treated   Male  63     None
## 10 55   Treated   Male  63     None
## 11 30   Treated   Male  64     None
## 12  5   Treated   Male  64     Some
## 13 63   Treated   Male  69     None
## 14 83   Treated   Male  70   Marked
## 15 66   Treated Female  23     None
## 16 40   Treated Female  32     None
## 17  6   Treated Female  37     Some
## 18  7   Treated Female  41     None
## 19 72   Treated Female  41   Marked
## 20 37   Treated Female  48     None
## 21 82   Treated Female  48   Marked
## 22 53   Treated Female  55   Marked
## 23 79   Treated Female  55   Marked
## 24 26   Treated Female  56   Marked
## 25 28   Treated Female  57   Marked
## 26 60   Treated Female  57   Marked
## 27 22   Treated Female  57   Marked
## 28 27   Treated Female  58     None
## 29  2   Treated Female  59   Marked
## 30 59   Treated Female  59   Marked
## 31 62   Treated Female  60   Marked
## 32 84   Treated Female  61   Marked
## 33 64   Treated Female  62     Some
## 34 34   Treated Female  62   Marked
## 35 58   Treated Female  66   Marked
## 36 13   Treated Female  67   Marked
## 37 61   Treated Female  68     Some
## 38 65   Treated Female  68   Marked
## 39 11   Treated Female  69     None
## 40 56   Treated Female  69     Some
## 41 43   Treated Female  70     Some
## 42  9   Placebo   Male  37     None
## 43 14   Placebo   Male  44     None
## 44 73   Placebo   Male  50     None
## 45 74   Placebo   Male  51     None
## 46 25   Placebo   Male  52     None
## 47 18   Placebo   Male  53     None
## 48 21   Placebo   Male  59     None
## 49 52   Placebo   Male  59     None
## 50 45   Placebo   Male  62     None
## 51 41   Placebo   Male  62     None
## 52  8   Placebo   Male  63   Marked
## 53 80   Placebo Female  23     None
## 54 12   Placebo Female  30     None
## 55 29   Placebo Female  30     None
## 56 50   Placebo Female  31     Some
## 57 38   Placebo Female  32     None
## 58 35   Placebo Female  33   Marked
## 59 51   Placebo Female  37     None
## 60 54   Placebo Female  44     None
## 61 76   Placebo Female  45     None
## 62 16   Placebo Female  46     None
## 63 69   Placebo Female  48     None
## 64 31   Placebo Female  49     None
## 65 20   Placebo Female  51     None
## 66 68   Placebo Female  53     None
## 67 81   Placebo Female  54     None
## 68  4   Placebo Female  54     None
## 69 78   Placebo Female  54   Marked
## 70 70   Placebo Female  55   Marked
## 71 49   Placebo Female  57     None
## 72 10   Placebo Female  57     Some
## 73 47   Placebo Female  58     Some
## 74 44   Placebo Female  59     Some
## 75 24   Placebo Female  59   Marked
## 76 48   Placebo Female  61     None
## 77 19   Placebo Female  63     Some
## 78  3   Placebo Female  64     None
## 79 67   Placebo Female  65   Marked
## 80 32   Placebo Female  66     None
## 81 42   Placebo Female  66     None
## 82 15   Placebo Female  66     Some
## 83 71   Placebo Female  68     Some
## 84  1   Placebo Female  74   Marked

6.1.1 简单的条形图

在该数据框中,变量improved记录了对每位接受了安慰剂或药物的病人的治疗效果:

复制代码
table(Arthritis$Improved)

## 
##   None   Some Marked 
##     42     14     28

**table()**函数用于创建频数表(频率表)或列联表,它可以统计向量中每个元素的出现次数。

对Improved变量作简单的条形图:

复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Improved))+geom_bar()+
  labs(title = "Simple Bar chart",x="Improved",y="Frequency")

将上面的变量图修改为横着的,利用函数**coord_flip()**可以在绘制图形时交换x轴和y轴的方向,从而实现图形的翻转(全称coordinate Flip就是坐标翻转的意思):

复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Improved))+geom_bar()+
  labs(title = "Horizontal Bar chart",x="Improved",y="Frequency")+
  coord_flip()

6.1.2 堆积、分组和填充条形图(柱状图)

例子:比较分别接受了安慰剂(Placebo)或药物(Treated)的病人的治疗效果

复制代码
table(Arthritis$Improved,Arthritis$Treatment)

##         
##          Placebo Treated
##   None        29      13
##   Some         7       7
##   Marked       7      21
6.1.2.1 堆积图,对Improved进行堆积,注意position="stack"
复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
  geom_bar(position = "stack")+
  labs(title="Stacked Bar chart",
       x="Treament",y="Frequency")
6.1.2.2 分组图,对Improved进行分组,注意position="dodge":
复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
  geom_bar(position = "dodge")+
  labs(title="Grouped Bar chart",
       x="Treament",y="Frequency")
6.1.2.3 填充条形图,对Improved进行填充,注意position="fill":

与堆积图的差别在于:填充图的纵坐标,即每个条形图的高度为1,段的高度代表百分比

复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
  geom_bar(position = "fill")+
  labs(title="Filled Bar chart",
       x="Treament",y="Frequency")

关于position的设置可以分为以下4种:

1)position="stack"(默认值):将柱子堆叠在一起,形成堆叠柱状图。

2)position="fill":将每个柱子的高度归一化为1,使得每个柱子的面积代表相对比例。这样可以更好地比较不同类别之间的相对频率或比例。

3)position="dodge":将柱子并排显示,以显示不同类别之间的直接比较。每个类别的柱子宽度保持不变。

4)position="identity"(用的少):不对柱子进行任何位置调整,直接使用数据中的数值作为柱子的位置。这通常用于自定义柱状图的位置布局。

6.1.3 均值条形图

6.1.3.1 举例

用R自带数据集state.x77来绘制1970年美国各地区的平均文盲率,数据集state.region具有每个州所属的地区名,看一下state.x77和state.region数据集:

复制代码
head(state.x77)

##            Population Income Illiteracy Life Exp Murder HS Grad Frost   Area
## Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
## Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
## Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
## Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
## California      21198   5114        1.1    71.71   10.3    62.6    20 156361
## Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766

state.region

##  [1] South         West          West          South         West         
##  [6] West          Northeast     South         South         South        
## [11] West          West          North Central North Central North Central
## [16] North Central South         South         Northeast     South        
## [21] Northeast     North Central North Central South         North Central
## [26] West          North Central West          Northeast     Northeast    
## [31] West          Northeast     South         North Central North Central
## [36] South         West          Northeast     Northeast     South        
## [41] North Central South         South         West          Northeast    
## [46] South         West          South         North Central West         
## Levels: Northeast South North Central West
6.1.3.2 计算不同地区的平均文盲率:
复制代码
states <- data.frame(state.region,state.x77)
library(dplyr)
plotdata <- states %>%
  group_by(state.region)%>%
  summarize(mean=mean(Illiteracy))
plotdata

## # A tibble: 4 × 2
##   state.region   mean
##   <fct>         <dbl>
## 1 Northeast      1   
## 2 South          1.74
## 3 North Central  0.7 
## 4 West           1.02
6.1.3.3 作图:
复制代码
library(ggplot2)
ggplot(plotdata,aes(x=reorder(state.region,mean),y=mean))+
  geom_bar(stat = "identity")+
  labs(x="region",
       y="mean",
       title = "Mean Illiteracy Rate")

注意

1)reorder()函数用于对因子(factor)变量进行重新排序,以便根据另一个变量的值对其进行排序。它通常与aes()函数结合使用,用于设置绘图的变量映射:

复制代码
reorder(variable, by_variable, FUN = NULL)

variable:是要重新排序的因子变量。被排序者

by_variable是用于排序的参考变量,可以是任何数值型变量或表达式。按什么排序

FUN是一个可选的函数,用于对by_variable进行聚合。默认情况下,它不进行聚合,而是直接使用by_variable的值进行排序。

2)stat = "identity"表示不进行任何统计变换,直接使用原始数据进行绘图。stat还可以设置为:

stat="count":默认选项,根据每个类别的频数(计数)创建柱状图。这是geom_bar的默认统计变换,它会自动对数据进行计数,并使用计数值作为柱子的高度。

stat="bin":将连续变量进行离散化分组,并显示每个分组的频数。这通常用于创建直方图,将连续变量分成多个离散的区间,并显示每个区间中观测值的频数。

stat="density":根据密度估计函数,计算每个类别的密度曲线。这适用于连续变量的柱状图,其中柱子的高度表示密度而不是频数。

stat="summary":根据指定的摘要函数,计算每个类别的摘要统计量,例如均值、中位数等。这对于创建带有摘要统计信息的柱状图很有用。

stat="bin2d":用于创建二维直方图,将两个连续变量分成多个二维的离散区间,并显示每个区间中观测值的频数。

6.1.3.4.带误差线的条形图

1.求SEM=SD/sqrt(n) ,这里用**n=n()**来计算每组组内观测值的数量:

复制代码
states <- data.frame(state.region,state.x77)
library(dplyr)
plotdata1<- states %>%
  group_by(state.region)%>%
  summarize(n=n(),
            mean=mean(Illiteracy),
            SEM=sd(Illiteracy)/sqrt(n))
plotdata1

## # A tibble: 4 × 4
##   state.region      n  mean    SEM
##   <fct>         <int> <dbl>  <dbl>
## 1 Northeast         9  1    0.0928
## 2 South            16  1.74 0.138 
## 3 North Central    12  0.7  0.0408
## 4 West             13  1.02 0.169
  1. 作图(带误差线)用函数geom_errorbar(),并用ymin和ymax设置误差线的上下限:

    library(ggplot2)
    ggplot(plotdata1,aes(x=reorder(state.region,mean),y=mean))+
    geom_bar(stat = "identity",fill="skyblue")+
    geom_errorbar(aes(ymin=mean-SEM,ymax=mean+SEM),width=0.2)+
    labs(x="region",
    y="mean",
    title = "Mean Illiteracy Rate",
    subtitle = "with standard error bars")

6.1.4 条形图的微调

6.1.4.1 颜色

在geom_bar中,fill="color"指定区域颜色,color="color"指定边框颜色。

前面对所有组添加的是同样的颜色,也可以利用**scale_fill_manual(values=c("color1","color2","color3",...))**来手动设定不同组为不同的颜色,例如:

复制代码
library(ggplot2)
ggplot(Arthritis,aes(x=Treatment,fill=Improved))+
  geom_bar(position = "stack",color="black")+
  scale_fill_manual(values = c("blue","red","skyblue"))
复制代码
  labs(title="Stacked Bar chart",
       x="Treament",y="Frequency")

## $x
## [1] "Treament"
## 
## $y
## [1] "Frequency"
## 
## $title
## [1] "Stacked Bar chart"
## 
## attr(,"class")
## [1] "labels"
6.1.4.2条形图的标签

直接来看例子:

复制代码
ggplot(mpg,aes(x=model))+
  geom_bar()+
  labs(title = "Car",y="Frequency",x="")

很显然,x轴的标签全部挤在一起,根本没法看,可以选择转换横纵坐标或者缩小x轴标签的字号并对其旋转一定角度。

1)旋转

复制代码
ggplot(mpg,aes(x=model))+
  geom_bar()+
  labs(title = "Car",y="Frequency",x="")+
  coord_flip()

2)修改坐标轴的字体字号和旋转角度

复制代码
ggplot(mpg,aes(x=model))+
  geom_bar()+
  labs(title = "Car",y="Frequency",x="")+
  theme(axis.text.x = element_text(angle = 45,hjust = 1,size = 8))

这里的theme()函数:

axis.text.x: 这指定我们正在自定义绘图中的x轴文本。

element_text(): 这是用于自定义绘图中文本元素(如轴标签、标题和图例)的函数。

angle = 45: 这个参数将x轴文本标签的角度设定为45度。这意味着标签将以顺时针45度的角度旋转。

hjust = 1: horizontal justification的缩写,意为水平对齐方式。0:左对齐;0.5:居中对齐;1:右对齐。

size = 8: 这个参数将x轴文本标签的大小设定为8点。它决定了标签的字体大小。

6.2 饼图

饼图在R中不被重视,故用的不多,函数有限,包括自带的pie() 函数,功能有限;和ggpie包,功能多一些,首先安装ggpie,这里是从github上安装:

复制代码
if(!require(remotes)) install.packages("remotes")

## 载入需要的程辑包:remotes

remotes::install_github("rkabacoff/ggpie")

## Skipping install of 'ggpie' from a github remote, the SHA1 (0316ac35) has not changed since last install.
##   Use `force = TRUE` to force installation

基本语法:

复制代码
ggpie(data,x,by,offset,percent,lengend,title)

data: 数据框(data frame)或数据集,包含要绘制饼图的数据。

x: 指定饼图的数值变量,它表示每个扇区的大小。

by: 指定饼图的分类变量,它表示每个扇区的类别标签。

offset(可选): 可以用来调整扇区的偏移量,以改变扇区的位置。

percent(可选): 一个逻辑值,用于指定是否在饼图中显示百分比标签。

legend(可选): 一个逻辑值,用于指定是否显示图例。

title(可选):一个字符向量,用于设置饼图的标题。

**举例1:**用mpg数据框中车型的数据制作饼图

复制代码
library(ggplot2)
library(ggpie)
mpg

## # A tibble: 234 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a4           1.8  1999     4 auto... f        18    29 p     comp...
##  2 audi         a4           1.8  1999     4 manu... f        21    29 p     comp...
##  3 audi         a4           2    2008     4 manu... f        20    31 p     comp...
##  4 audi         a4           2    2008     4 auto... f        21    30 p     comp...
##  5 audi         a4           2.8  1999     6 auto... f        16    26 p     comp...
##  6 audi         a4           2.8  1999     6 manu... f        18    26 p     comp...
##  7 audi         a4           3.1  2008     6 auto... f        18    27 p     comp...
##  8 audi         a4 quattro   1.8  1999     4 manu... 4        18    26 p     comp...
##  9 audi         a4 quattro   1.8  1999     4 auto... 4        16    25 p     comp...
## 10 audi         a4 quattro   2    2008     4 manu... 4        20    28 p     comp...
## # ℹ 224 more rows

ggpie(mpg,class)
复制代码
ggpie(mpg,class,legend = FALSE,offset = 2)
复制代码
ggpie(mpg,class,year,legend = FALSE,offset = 1.3)

6.3 直方图(展示连续型变量)

6.3.1 语法

复制代码
ggplot(data,aes(x=连续型变量))+geom_histogram()

6.3.2 用mpg数据框举例

复制代码
head(mpg)

## # A tibble: 6 × 11
##   manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class 
##   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr> 
## 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compa...
## 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compa...
## 3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compa...
## 4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compa...
## 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compa...
## 6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compa...
6.3.2.1 基础直方图
复制代码
library(ggplot2)
cars2008 <- mpg[mpg$year==2008,]
cars2008

## # A tibble: 117 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a4           2    2008     4 manu... f        20    31 p     comp...
##  2 audi         a4           2    2008     4 auto... f        21    30 p     comp...
##  3 audi         a4           3.1  2008     6 auto... f        18    27 p     comp...
##  4 audi         a4 quattro   2    2008     4 manu... 4        20    28 p     comp...
##  5 audi         a4 quattro   2    2008     4 auto... 4        19    27 p     comp...
##  6 audi         a4 quattro   3.1  2008     6 auto... 4        17    25 p     comp...
##  7 audi         a4 quattro   3.1  2008     6 manu... 4        15    25 p     comp...
##  8 audi         a6 quattro   3.1  2008     6 auto... 4        17    25 p     mids...
##  9 audi         a6 quattro   4.2  2008     8 auto... 4        16    23 p     mids...
## 10 chevrolet    c1500 sub...   5.3  2008     8 auto... r        14    20 r     suv  
## # ℹ 107 more rows

ggplot(cars2008,aes(x=cty))+
  geom_histogram()+
  labs(title = "defult histogram")

## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
6.3.2.2 彩色直方图
复制代码
ggplot(cars2008,aes(x=hwy))+
  geom_histogram(bins=20,color="white",fill="green")+
  labs(title = "colored histogram1")
复制代码
ggplot(cars2008,aes(x=hwy))+
  geom_histogram(bins=40,color="white",fill="green")+
  labs(title = "colored histogram2")

这里的bins这么理解:

直方图通过将数据分成多个区间(也称为箱子)来显示数据的分布情况。bins参数就是用来控制直方图中箱子的数量。具体来说,bins表示将整个数据范围(取值范围)划分为多少个等宽的区间。

假设你有一组数值数据,例如 1, 2, 3, 4, 5, 6, 7, 8, 9, 10。如果你将 bins 设置为 5,那么直方图将把数据范围(1-10)分成个等宽的区间,每个区间一个箱子。在这个例子中,每个箱子的宽度将是 (10-1)/5 = 1.8。

直方图的每个箱子将统计数据中落在该区间内(横着看,纵坐标体现的是频率)的观测值的数量,并绘制相应的条形。箱子的高度表示该区间内观测值的频数(或频率)。

6.3.2.3 纵坐标为百分比直方图

可以利用之前学到的scale() 函数结合y=..density..

复制代码
library(scales)
ggplot(cars2008,aes(x=hwy,y=..density..))+
  geom_histogram(bins=20,color="white",fill="green")+
  scale_y_continuous(labels = scales::percent)+
  labs(title = "Histogram with percent",
       x="city miles per gallon",
       y="Percent")

## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
6.3.2.4纵坐标为百分比直方图同时添加核密度线反应变化趋势

使用geom_density()函数

复制代码
library(scales)
ggplot(cars2008,aes(x=hwy,y=..density..))+
  geom_histogram(bins=20,color="white",fill="green")+
  scale_y_continuous(labels = scales::percent)+
  geom_density(color="black",size=0.5)
复制代码
  labs(title = "Histogram with density curve",
       x="city miles per gallon",
       y="Percent")

## $x
## [1] "city miles per gallon"
## 
## $y
## [1] "Percent"
## 
## $title
## [1] "Histogram with density curve"
## 
## attr(,"class")
## [1] "labels"

6.4 核密度图(曲线)

---一种在某个结果变量上跨组比较观测的强大方法

语法:

复制代码
ggplot(data,aes(x=连续性变量))+geom_density()

6.4.1 举例(2008年汽车的每加仑汽油行驶英里数)

基础版

复制代码
library(ggplot2)
data(mpg)
cars2008 <- mpg[mpg$year==2008,]
ggplot(cars2008,aes(x=cty))+geom_density()

填充版

复制代码
ggplot(cars2008,aes(x=cty))+geom_density(fill="red")

打印默认带宽

复制代码
bw.nrd0(cars2008$cty)

## [1] 1.408399

带宽(bandwidth)是一个用于控制核密度估计平滑度的参数。带宽决定了核函数在估计过程中的影响范围,从而影响了密度曲线的形状和平滑程度。

带宽的选择对于核密度估计的结果非常重要。较小的带宽会导致对数据的细微波动敏感,曲线可能会出现过度适应的情况,导致过拟合。而较大的带宽会导致曲线平滑度增加,可能会隐藏真实的数据特征。

带宽可以通过 adjust 参数来调整。adjust的默认值是1,它根据数据点的密度和总样本量自动选择带宽。较小的 adjust 值将产生较小的带宽,而较大的 adjust 值将产生较大的带宽。

可以通过手动设置 adjust 参数的值来控制带宽的大小。较小的 adjust 值(例如 0.2 或0.5)会使曲线更加细致地适应数据的细节,而较大的 adjust 值(例如 2或3)会使曲线更加平滑。

调整带宽

复制代码
ggplot(cars2008,aes(x=cty))+geom_density(fill="red",adjust=0.2)
复制代码
ggplot(cars2008,aes(x=cty))+geom_density(fill="red",adjust=3)

6.4.2 核密度图之间的比较

比较2008年四缸车、六缸车和八缸车,cyl(气缸数)的每加仑汽油行驶英里数估计值:

复制代码
library(ggplot2)
data(mpg,package="ggplot2")
cars2008 <- mpg[mpg$year==2008 & mpg$cyl !=5,]
cars2008$Cylinders <- factor(cars2008$cyl)
ggplot(cars2008,aes(x=cty,color=Cylinders,linetype=Cylinders))+
  geom_density(size=1)

气缸数(cyl)保存为类别型因子(Cylinders)。对变量Cylinders的每个水平绘制核密度曲线,颜色和线条类型都映射到气缸数。

注:使用factor()函数使Cylinders变为一个因子变量,使它变为连续变量。因为它原来是一个分类变量,不能用于该作图。

6.5 箱图geom_boxplot()

通过连续绘制变量的5个统计量,即最小值、下四分位数、中位数、上四分位数和最大值,描述连续型变量的分布。能够显示出可能离群点(范围+-1.5*IQR以外的值,IQR表示四分位距)。

6.5.1 单组举例

复制代码
library(ggplot2)
ggplot(mtcars,aes(x="",y=mpg))+
  geom_boxplot()

6.5.2 多组举例(x为组别,y为观测值)

复制代码
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)#使它变成因子变量
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty))+
  geom_boxplot()

6.5.3 notch=TRUE和varwidth=TRUE

1)当notch=TRUE 时,在**geom_boxplot()**函数中创建的箱线图中,会在每个箱体的中央绘制一个切口。这个切口是基于中位数的置信区间计算的,可以用来比较两个或多个组之间中位数是否有显著差异。如果notches不重叠,就可以得出结论,这两组数据的中位数存在显著差异。

2)varwidth参数用于确定箱子的宽度是否应该与每个组中的观测值数量的平方根成比例(varwidth = TRUE),还是所有的箱子应该具有相同的宽度(varwidth = FALSE)。

当varwidth = TRUE时,箱子的宽度根据每个组的样本大小进行调整,较大的箱子表示较大的样本大小。这在比较不同样本大小的组之间变量分布时很有用。

也可以使用width=具体值来制定箱图的宽度

复制代码
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty))+
  geom_boxplot(notch = TRUE,
               varwidth = TRUE)

6.5.4 多个分组因子

除了4,6,8缸车的分组外,同时我们加入不同年份的分组,并手动设置颜色:

复制代码
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty,fill=Year))+
  geom_boxplot(notch = TRUE,
               varwidth = TRUE)+
  scale_fill_manual(values = c("gold","green"))

## Notch went outside hinges
## ℹ Do you want `notch = FALSE`?

6.6 小提琴图geom_violin()

小提琴图是箱图和核密度图的结合:

复制代码
cars <- mpg[mpg$cyl !=5,]
cars$Cylinders <- factor(cars$cyl)
cars$Year <- factor(cars$year)
ggplot(cars,aes(x=Cylinders,y=cty,))+
  geom_boxplot(width=0.2,fill="green")+
  geom_violin(fill="gold",alpha=0.3)

width=0.2是为了箱图能放进去,小提琴图中的alpha=0.3是使其透明使得能看到箱图。

中间线为中位数。

6.7 点图geom_point()

6.7.1 用ggplot中的geom_point()

语法:

复制代码
ggplot(data,aes=(x=连续性变量,y=分类变量))+geom_point()

举例:

复制代码
library(ggplot2)
library(dplyr)
plot <- mpg %>%
  filter(year=="2008") %>%
  group_by(model) %>%
  summarise(meanhwy=mean(hwy))
plot

## # A tibble: 38 × 2
##    model              meanhwy
##    <chr>                <dbl>
##  1 4runner 4wd           18.5
##  2 a4                    29.3
##  3 a4 quattro            26.2
##  4 a6 quattro            24  
##  5 altima                29  
##  6 c1500 suburban 2wd    18  
##  7 camry                 30  
##  8 camry solara          29.7
##  9 caravan 2wd           22.2
## 10 civic                 33.8
## # ℹ 28 more rows

ggplot(plot,aes(x=meanhwy,y=model))+
  geom_point()

根据数值大小排序(正序):

复制代码
ggplot(plot,aes(x=meanhwy,y=reorder(model,meanhwy)))+
  geom_point()

根据数值大小排序(倒序):

复制代码
ggplot(plot,aes(x=meanhwy,y=reorder(model,-meanhwy)))+
  geom_point()

6.8 补充dplyr的用法

dplyr全称为"data plyer",里面包含可以处理数据的函数,例如:

1.对数据进行汇总统计
复制代码
summary_data <- summarize(data, summary_variable = summary_function(variable))
2.对数据进行分组
复制代码
grouped_data <- group_by(data, variable)
3.创建新的变量
复制代码
mutated_data <- mutate(data, new_variable =expression)
4.按照指定的变量排序
复制代码
arranged_data <- arrange(data, variable)
5.筛选出满足条件的观测行
复制代码
filtered_data <- filter(data, condition)
6.选择特定的列
复制代码
selected_data <- select(data, column1, column2)
7.去除重复的观测
复制代码
distinct_data <- distinct(data)
8.连接多个数据框
复制代码
joined_data <- join(data1, data2, by = "key_variable")

6.9 补充:直方图和条形图的区别

1.数据类型:直方图用于连续变量的数据分布,而条形图用于离散或分类变量的数据比较。

2.横纵轴:直方图的横轴表示数据的取值范围,纵轴表示频数或频率。而条形图的横轴表示不同的类别或组,纵轴表示各类别的计数、频率或其他度量。

3.连续性:直方图中的每个条形是连续的,相邻的条形之间没有间隔。而条形图中的每个条形是离散的,它们之间可以有间隔。

4.用途:直方图常用于探索和展示数据的分布特征,例如观察数据的中心趋势、离散程度和偏斜程度。条形图常用于比较不同类别或组之间的数据,例如不同产品销售额的比较、不同地区的人口统计数据比较等。

总体而言,直方图更适合表示连续变量的分布情况,而条形图更适合比较离散变量或分类变量之间的差异。选择使用哪种图表类型取决于你要传达的信息和你的数据类型。

完整教程请查看

R语言基础学习手册

相关推荐
知识分享小能手3 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(22)
开发语言·学习·r语言
yuanyuan3348 小时前
高清车牌识别系统选型技术指南:识别等级与材质耐候性横向对比
信息可视化·车牌识别系统·车牌识别厂家·车牌识别一体机·车牌识别品牌厂家·车牌识别技术
科研 E 助手10 小时前
办公场景高效数据图表工具推荐
信息可视化
躺柒10 小时前
读数据可视化14空间标量场(下)
信息可视化·数据挖掘·数据分析·数据可视化·空间分析
躺柒10 小时前
读数据可视化15大规模多变量空间数据(上)
信息可视化·可视化·数据可视化·空间计算·空间
知识分享小能手10 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(21)
开发语言·学习·r语言
H0311169851 天前
关于当前主流知识库工具在分类整理学习资料场景下的选用参考
人工智能·信息可视化·音视频
商业咨询信息1 天前
常州·无锡·镇江·泰州宣传片拍摄制作公司哪家好?2026年制造业选型全指南
信息可视化
戴西软件1 天前
国内有哪些数据轻量化格式转换软件?
数据库·算法·安全·信息可视化·自动化·rpa
躺柒2 天前
读数据可视化13空间标量场(上)
人工智能·深度学习·信息可视化·数据可视化·空间·大数据分析