R语言

ggplot2之常见观察变量绘图geom

2020-06-11  本文已影响0人  小贝学生信

一、直方图

之前在初学ggplot2包时,初步了解了ggplot_histgram()是针对一组连续型变量绘制频率图(直方图)。由于在描述单变量变动时很方便,这里再学下。
此外值得注意的是ggplot_bar()是根据类别型变量绘制条形图的。

1、基础参数

library(ggplot2)
head(diamonds)
ggplot(data = diamonds, aes(x = carat)) +
  geom_histogram()
简单直方图
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)
多组折线图
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)
diamonds2 <- diamonds %>%
mutate(y = ifelse(y < 3 | y > 20, NA, y))

二、箱线图

主要适用于多组连续型变量的统计分布绘图。虽然上面介绍的多组折线图也能绘制,但箱线图更适用于组值分布观察,折线图更适合观察变动。

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:更改每组箱线图的排序

ggplot(data = mpg, aes(
  x = reorder(class, hwy, FUN = median),y = hwy)) +
  geom_boxplot()

如上代码,根据每组中位值大小(从小到大)排列箱线图次序。


中位值排序
ggplot(data = mpg) +
  geom_boxplot(mapping = aes(
    x = factor(class,  levels = c("compact","2seater","midsize","minivan",
                                  "pickup", "subcompact","suv")),
    y = hwy))
自定义排序

三、点图

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()函数
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"
  )
文本标注

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()
上一篇 下一篇

猜你喜欢

热点阅读