一、直方图
之前在初学ggplot2包时,初步了解了
ggplot_histgram()
是针对一组连续型变量绘制频率图(直方图)。由于在描述单变量变动时很方便,这里再学下。
此外值得注意的是ggplot_bar()
是根据类别型变量绘制条形图的。
-
plot()
泛型绘图函数也能绘制直方图,之前也有简单笔记,可对比学习R语言入门--第五节(认识基本统计图)
1、基础参数
library(ggplot2)
head(diamonds)
ggplot(data = diamonds, aes(x = carat)) +
geom_histogram()
简单直方图
- 绘制直方图关键要控制条形数,可以从两方面决定。geom_histogram()函数由两种参数:
bins =
直接交代绘制条形的数目,简单但意义难以阐述;如上代码未交待任何参数,参数默认bins = 30
binwidth =
通过交代条形宽度,间接决定条形数,如下例
range(diamonds$carat)
library(dplyr)
diamonds %>%
count(cut_width(carat, 0.5))
#查看carat变量以0.5为划分的count数
ggplot(diamonds, aes(x = y)) +
geom_histogram(binwidth = 0.5) #交代区间宽度为0.5
修改binwidth = 参数
2、分组绘制
如果想对连续型变量由类别型变量分为若干组后,再绘制直方图,由于重叠性而不好观察。因此可用折线图代替geom_freqploy()
- 可以把折线图想成由直方图转换的,所以基本参数相同。
ggplot(data = diamonds, aes(x = carat, color = cut)) +
geom_histogram(binwidth = 0.1)
多组折线图
- 如果想查看并比较平均每组中的分布情况,需要改变 y 轴的显示内容,不再显示计数,而是显示密度。密度是对计数的标准化,这样每个频率多边形下边的面积都是 1
ggplot(data = diamonds,aes(x = price, y = ..density..)) +
geom_freqpoly(aes(color = cut), binwidth = 500)
密度-折线图
3、异常值观测
当条形图出现极大、极小值时,极小值的直方图因为比例原因几乎难以观察;
ggplot(diamonds, aes(x = y)) +
geom_histogram(binwidth = 0.5)
此时可以通过人为修改y轴的范围,从而改变图形显示。具体有2种方式
(1)修改coord_cartesian()
函数的ylim参数
这种方式的效果相当于局部放大
ggplot(diamonds, aes(x = y)) +
geom_histogram(binwidth = 0.5) +
coord_cartesian(ylim = c(0, 50))
coord_cartesian(ylim = c(0, 50))
(2)直接修改ylim()
函数
注意在ggplot2里,就有ylim()这个函数,用以修改坐标轴域。与上面不一样的是此函数约定当变量y轴值抽过给定范围时,则不绘制该数据。
ggplot(diamonds, aes(x = y)) +
geom_histogram(binwidth = 0.5) +
ylim(0, 50)
#此时 warning也有提示删除了超限的值
ylim(0, 50)
- 异常值一般会干扰整体的分析,如果想避免干扰,要么删除,要么用缺失值代替,可用ifelse()进行操作,后者示例如下;此后基础上若想删除,则设置
na.rm = TRUE
即可
diamonds2 <- diamonds %>%
mutate(y = ifelse(y < 3 | y > 20, NA, y))
二、箱线图
主要适用于多组连续型变量的统计分布绘图。虽然上面介绍的多组折线图也能绘制,但箱线图更适用于组值分布观察,折线图更适合观察变动。
-
geom_boxplot()
函数
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot()
geom_boxplot()
调整1:水平旋转 coord_flip()函数
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot()+
coord_flip()
coord_flip()
调整2:更改每组箱线图的排序
- (1)根据组特征值排序
ggplot(data = mpg, aes(
x = reorder(class, hwy, FUN = median),y = hwy)) +
geom_boxplot()
如上代码,根据每组中位值大小(从小到大)排列箱线图次序。
中位值排序
- (2)自定义排序
主要直接设置因子顺序
ggplot(data = mpg) +
geom_boxplot(mapping = aes(
x = factor(class, levels = c("compact","2seater","midsize","minivan",
"pickup", "subcompact","suv")),
y = hwy))
自定义排序
三、点图
-
geom_point
函数绘制点图,常针对于两组连续型变量(可用颜色、性状分组)
image.png - 这里介绍点图的两种处理方式,点图注释与大数据绘制点图
1、注释--点标注
(1)geom_text()
函数
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class))
#根据class,筛选出每类中 hwy最高的点
best_in_class <- mpg %>%
group_by(class) %>%
filter(row_number(desc(hwy)) == 1)
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
geom_text(aes(label = model), data = best_in_class)
#如上,点标注需要提供含有名字列的原始数据的子集
geom_text()
点标注可以理解为给文本字符串提供坐标信息;在plot绘制点图时也有类似的方法,此外其还可以用identify()函数进行交互式点标注,见笔记。但尝试了下在ggplot中好像不行。
(2)geom_lable()
函数
- 特色功能:可以为文本加上方框,并使用nudge_y参数调整标签位置
-
nudge_y =
参数设置标签的上下,值参考自身的高度;nudge_x
与之相对。
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
geom_label(
aes(label = model),
data = best_in_class,
nudge_x = 0.5,
nudge_y = 2,
alpha = 0.5
)
(3)ggrepel包
- 特色功能:避免标签的重叠,自动调整位置
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(color = class)) +
geom_point(size = 3, shape = 1, data = best_in_class) +
ggrepel::geom_label_repel(
aes(label = model),
data = best_in_class
)
如上还添加了一个图层,用较大的空心圆来强调添加了标签的数据点。
2、注释--文本标注
- 在绘图区域的空白处加一段说明性文字,一般位于四个角处。
label <- data.frame(
displ = 6, hwy = 42,
label = paste(
"Increasing engine size is \nrelated to",
"decreasing fuel economy."
))
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_text(
aes(label = label), data = label,
vjust = "top", hjust = "center"
)
- 如上代码先要交代文本标注的文字、内容,注意要是表格格式
- 利用
geom_text()
函数标注,其中vjust = "left/center/right"与hjust = "top/center/bottom"参数调整的是文本的对齐方式,不是位置~
3、大数据,点重叠
ggplot(data = diamonds, aes(x = carat, y = price)) +
geom_point()
ggplot(data = diamonds, aes(x = carat, y = price)) +
geom_point(alpha = 1 / 100)
#设置透明度,减少由于点重叠难以观察
geom_point(alpha = 1 / 100)
四、两类分类变量时的频数绘制图
1、geom_count()
用点大小反应频数
ggplot(data = diamonds, aes(x = cut, y = color)) +
geom_count()
geom_count()
2、geom_tile()
近似热图
test <- diamonds %>%
count(color, cut)
ggplot(data = test, aes(x = color, y = cut)) +
geom_tile(aes(fill = n))
diamonds %>%
count(color, cut) %>%
ggplot(mapping = aes(x = color, y = cut)) +
geom_tile(mapping = aes(fill = n))
geom_tile()
网友评论