# 「R」R 的基本图形绘制

• 将变量的分布进行可视化的展示;
• 通过结果变量进行跨组比较。

## 条形图

`barplot(height)`

### 简单条形图

`height`是一个向量，则它的值就确定了各条形图的高度，并将绘制一幅垂直的条形图。使用选项`horiz=TRUE`则会生成一幅水平条形图。

```> library(vcd)

> library(grid)
> counts <- table(Arthritis\$Improved)
> counts

None   Some Marked
42     14     28 ```

```> barplot(counts,
+         main="Simple Bar Plot",
+         xlab="Improvement", ylab="Frequency")
> barplot(counts,
+         main="Horizontal Bar Plot",
+         xlab="Frequency", ylab="Improvement",
+         horiz=TRUE)```

simple_bar_plot.png

horiz_bar_plot.png

#### 生成因素变量的条形图

```> plot(Arthritis\$Improved, main="Simple Bar Plot",
+     xlab="Improvement", ylab="Frequency")
> plot(Arthritis\$Improved, main="Horizontal Bar plot",
+     xlab="Frequency", ylab="Improvement", horiz=TRUE)```

### 堆砌条形图和分组条形图

```> library(vcd)
> counts <- table(Arthritis\$Improved, Arthritis\$Treatment)
> counts

Placebo Treated
None        29      13
Some         7       7
Marked       7      21
> barplot(counts,
+         main="Stacked Bar Plot",
+         xlab="Treatment", ylab="Frequency",
+         col=c("red", "yellow", "green"),
+         legend=rownames(counts))
> barplot(counts,
+         main="Grouped Bar Plot",
+         xlab="Treatment", ylab="Frequency",
+         col=c("red", "yellow", "green"),
+         legend=rownames(counts), beside=TRUE)```

stacked_bar_plot.png

grouped_bar_plot.png

### 均值条形图

```> states <- data.frame(state.region, state.x77)
> means <- aggregate(states\$Illiteracy, by=list(state.region), FUN=mean)
> means
Group.1        x
1     Northeast 1.000000
2         South 1.737500
3 North Central 0.700000
4          West 1.023077
> means <- means[order(means\$x),]
> means
Group.1        x
3 North Central 0.700000
1     Northeast 1.000000
4          West 1.023077
2         South 1.737500
> barplot(means\$x, names.arg = means\$Group.1)
> title("Mean Illiteracy Rate")```

mean_bar_plot.png

### 条形图的微调

```par(mar=c(5, 8, 4, 2))  # 增加y边界大小
par(las=2)              # 旋转条形的标签
counts <- table(Arthritis\$Improved)
barplot(counts,
main="Treatment Outcome",
horiz=TRUE,
cex.names = 0.8,    # 缩小字体大小，让标签更合适
names.arg = c("No Improvement", "Some Improvement",
"Marked Improvement")) # 修改标签文本```

treatment_bar_plot.png

### 棘状图

```library(vcd)
attach(Arthritis)
counts <- table(Treatment, Improved)
spine(counts, main="Spinogram Example")
detach(Arthritis)```

spinogram_plot.png

## 饼图

`pie(x, labels)`

## 直方图

`hist(x)`

`x`是一个由数据值组成的数值向量。参数`freq=FALSE`表示根据概率密度而不是频数绘制图形。参数`breaks`用于控制组的数量。默认等距切分。以下提供绘制四种直方图的代码：

```par(mfrow=c(2,2))     # 定义子图

hist(mtcars\$mpg)     # 简单直方图

hist(mtcars\$mpg,
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Colored histogram with 12 bins") # 指定组数和颜色

hist(mtcars\$mpg,
freq=FALSE,
breaks=12,
col="red",
xlab="Miles Per Gallon",
main="Histogram, rug plot, density curve")
# 轴须图(rug plot)是实际数据值的一种一维呈现方式
# 如果数据中有许多的结（相同的值），可以使用下列代码将其数据打散
# rug(jitter(mtcars\$mpg, amount=0.01))
rug(jitter(mtcars\$mpg))
# 这条密度曲线是一个核密度估计，为数据的分布提供了更加平滑的描述，会在下节具体讲述。
lines(density(mtcars\$mpg), col="blue", lwd=2) # 添加轴须图

x <- mtcars\$mpg
h <- hist(x,
breaks=12,
xlab="Miles Per Gallon",
main="Histogram with normal curve and box")
# 叠加正态曲线
xfit <- seq(min(x), max(x), length=40)
yfit <- dnorm(xfit, mean=mean(x), sd=sd(x))
yfit <- yfit*diff(h\$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2)
# 盒型
box()                              # 添加密度曲线和外框```

hist_example_plot.png

### 核密度图

`plot(density(x))`

#### 核密度图

```par(mfrow=c(2,1))
d <- density(mtcars\$mpg)

plot(d)                      # 默认设置创建最简图形

d <- density(mtcars\$mpg)
plot(d, main="Kernel Density of Miles Per Gallon")
polygon(d, col="red", border="blue") # 边界为蓝色，用红色填充
rug(mtcars\$mpg, col="brown")         # 棕色轴须图```

density_default_plot.png

#### 可以比较的核密度图

`sm.density.compare(x, factor)`

```library(sm)
attach(mtcars)

# 创建分组因子
# 将数值型向量cyl中的(4,6,8)转换为因子
cyl.f <- factor(cyl, levels=c(4,6,8),
labels = c("4 cylinder", "6 cylinder",
"8 cylinder"))
# 绘制密度图
sm.density.compare(mpg, cyl, xlabel="Miles Per Gallon")
title(main="MPG Distribution by Car Cylinders")

# 通过鼠标点击添加图例
# 第一个参数locator(1)表示用鼠标点击放置图例的位置；第二个参数是由标签组成的字符向量，第三个参数值使用向量colfill为cyl.f的每一个水平指定一种颜色。
colfill <- c(2:(1+length(levels(cyl.f))))
legend(locator(1), levels(cyl.f), fill=colfill)

detach(mtcars)```

density_compare_plot.png

## 箱线图

`boxplot(mtcars\$mpg, main="Box Plot", ylab="Miles per Gallon")`

box_plot.png

### 使用并列箱线图进行跨组比较

`boxplot(formula, data=dataframe)`

```# 研究不同的发动机缸数对每加仑汽油行驶的英里数的影响
boxplot(mpg ~ cyl, data=mtcars,
main="Car Mileage Data",
xlab="Number of Cylinders",
ylab="Miles Per Gallon")```

car_mileage_data_plot.png

### 凹槽图

```boxplot(mpg ~ cyl, data=mtcars,
notch=TRUE,
varwidth=TRUE,
col="red",
main="Car Mileage Data",
xlab="Number of Cylinders",
ylab="Miles Per Gallon")```

car_mil_data_plot.png

### 交叉因子箱线图

```mtcars\$cyl.f <- factor(mtcars\$cyl,
levels=c(4,6,8),
labels = c("4", "6", "8"))

mtcars\$am.f <- factor(mtcars\$am,
levels=c(0,1),
labels = c("auto", "standard"))

boxplot(mpg ~ am.f * cyl.f,
data=mtcars,
varwidth=T,
col=c("gold", "darkgreen"),
main="MPG Distribution by Auto Type",
xlab="Auto Type", ylab="Miles Per Gallon")```

mpg_dis_plot.png

## 点图

`dotchart(x, labels=)`

```dotchart(mtcars\$mpg, labels=row.names(mtcars), cex=.7,
main="Gas Mileage for Car Models",
xlab="Miles Per Gallon")```

dotchart_example.png

### 分组、排序、着色后的点图

```x <- mtcars[order(mtcars\$mpg),]

x\$cyl <- factor(x\$cyl)

x\$color[x\$cyl==4] <- "red"
x\$color[x\$cyl==6] <- "blue"
x\$color[x\$cyl==8] <- "darkgreen"

dotchart(x\$mpg,
labels = row.names(x),
cex = .7,
groups = x\$cyl,
gcolor = "black",
color = x\$color,
pch = 19,
main = "Gas Mileage for Car Models\ngrouped by cylinder.",
xlab = "Miles Per Gallon")```

dotchart_example2.png

0 条评论

• ### 「R」Shiny：工作流（一）开发工作流

优化开发工作流程的目标是减少做出更改和看到结果之间的时间。迭代的速度越快，你可以进行的实验就越快，你就可以成为一名更好的 Shiny 开发人员。这里有两个主要的...

• ### 「R」R传统图形绘制多图

mfrow 和 mfcol 都由 2 个数字指定，一个表示行数、一个表示列数。如果使用 mfrow，那么图像区域会被按行依次使用；如果使用 mfcol，那么图像...

• ### Python 为什么使用缩进来划分代码块？

本期话题：Python 为什么使用缩进来划分代码块，而不像其它语言使用花括号 {} 或者 “end” 之类的语法？

• ### Python 开源项目 Top30 值得收藏

编译 | AI科技大本营 参与 | SuiSui 继推出2017年机器学习开源项目Top 30榜单后，Mybridge AI又推出了一个Python开源项目To...

• ### 从15000个Python开源项目中精选的Top30，Github平均star为3707，赶紧收藏！

翻译 | AI科技大本营（ID：rgznai100） 参与 | SuiSui 继推出2017年机器学习开源项目Top 30榜单后，Mybridge AI又推出了...

• ### Dart 笔记 7 - 断言与异常

Assert 语句不会影响生产环境中代码的执行，它仅仅在测试环境中起作用。在 Flutter 的调试模式下可以使用 assert。

• ### 从15000个Python开源项目中精选TOP30，GitHub平均star为3707，赶紧收藏！

参与 | SuiSui 继推出 2017年机器学习开源项目Top 30榜单 后，Mybridge AI又推出了一个Python开源项目Top 30榜单，包括开源...

• ### 工程系的学生为什么要学Wolfram语言而不是Matlab

Matlab 类似于 Fortune 和 C 代码，估计一般的小朋友是没有兴趣学的。Mathematica 是函数式编程，当然也支持过程式编程，还有对象编程、基...

• ### Rust FFI 编程 - Rust导出共享库05

（注意，我已经将 cargo build 生成的 librustffi4.so 文件从 target/debug/ 目录拷贝至 C 代码所在目录）