R 可视乎 | 华夫饼图

简介: R 可视乎 | 华夫饼图

前言

华夫饼图(waffle chart)分为块状华夫饼图点状华夫饼图。它是展示总数据的组类别情况的一种有效图表。它是西方的一种 由小方格组成的面包,所以这种图表因此得名为华夫饼图。

本文框架


数据介绍

#相关包
library(ggplot2)
library(RColorBrewer)
library(reshape2)
nrows <- 10
categ_table <- round(table(mpg$class ) * ((nrows*nrows)/(length(mpg$class))))
sort_table<-sort(categ_table,index.return=TRUE,decreasing = FALSE)
Order<-sort(as.data.frame(categ_table)$Freq,index.return=TRUE,decreasing = FALSE)
df <- expand.grid(y = 1:nrows, x = 1:nrows)
df$category<-factor(rep(names(sort_table),sort_table), levels=names(sort_table))
Color<-brewer.pal(length(sort_table), "Set2")
head(df)

前 6 行数据如下所示,y 从 1~10,x 也是从 1~10。



ggplot 包绘制

块状华夫饼图

块状华夫饼图的小方格用不同颜色表示不同类别,适合用来快速检视数 据集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让 人更容易找出当中模式。

接下来通过以上数据进行实现。代码看着很长,但是有一半都是主题的设置 theme(),绘制块状华夫饼图的主要函数为 geom_tile(),详细参数介绍可见:1[1]

ggplot(df, aes(x = y, y = x, fill = category)) +
geom_tile(color = "white", size = 0.25) +
    coord_fixed(ratio = 1)+ #x,y 轴尺寸固定, ratio=1 表示 x , y 轴长度相同
    scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
    scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
    scale_fill_manual(name = "Category",values = Color)+
    theme(
      panel.background = element_blank(),
      plot.title = element_text(size = rel(1.2)),
      axis.text = element_blank(),
      axis.title = element_blank(),
      axis.ticks = element_blank(),
      legend.title = element_blank(),
      legend.position = "right")



点状华夫饼图

点状华夫饼图(dot matrix chart)以点为单位显示离散数据,每种颜色 的点表示一个特定类别,并以矩阵形式组合在一起,适合用来快速检视数据 集中不同类别的分布和比例,并与其他数据集的分布和比例进行比较,让人 更容易找出当中模式。

绘制点状华夫饼图的主要函数为 geom_circle(),详细参数介绍可见:2[2]

library(ggforce)
ggplot(df, aes(x0 = y, y0 = x, fill = category,r=0.5)) +
  geom_circle(color = "black", size = 0.25) +
  #geom_point(color = "black",shape=21,size=6) +
  coord_fixed(ratio = 1)+
  scale_x_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_y_continuous(trans = 'reverse') +#expand = c(0, 0),
  scale_fill_manual(name = "Category",
                    #labels = names(sort_table),
                    values = Color)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
    panel.background  = element_blank(),
    plot.title = element_text(size = rel(1.2)),
    legend.position = "right")



图形解释:这个图从横坐标(y)看,在 y 为 10 时,有 2 个 pichup,一个 subcompact 等。从纵坐标(x)看,在 x 为 10 时,全是 suv 类型。从总体来看,suv 占最多数(16 个),2seater 占最少数(2 个)。

堆积型华夫饼图

这里还有一种比较有趣的华夫饼图。

library(dplyr)
nrows <- 10
ndeep <- 10
unit<-100
df <- expand.grid(y = 1:nrows, x = 1:nrows)
categ_table <- as.data.frame(table(mpg$class) * (nrows*nrows))
colnames(categ_table)<-c("names","vals")
categ_table<-arrange(categ_table,desc(vals))
categ_table$vals<-categ_table$vals /unit
tb4waffles <- expand.grid(y = 1:ndeep,x = seq_len(ceiling(sum(categ_table$vals) / ndeep)))
regionvec <- as.character(rep(categ_table$names, categ_table$vals))
tb4waffles<-tb4waffles[1:length(regionvec),]
tb4waffles$names <- factor(regionvec,levels=categ_table$names)
Color<-brewer.pal(nrow(categ_table), "Set2")
ggplot(tb4waffles, aes(x = x, y = y, fill = names)) +
  #geom_tile(color = "white") + #
  geom_point(color = "black",shape=21,size=5) + #
  scale_fill_manual(name = "Category",
                    values = Color)+
  xlab("1 square = 100")+
  ylab("")+
  coord_fixed(ratio = 1)+
  theme(#panel.border = element_rect(fill=NA,size = 2),
         panel.background  = element_blank(),
        plot.title = element_text(size = rel(1.2)),
        #axis.text = element_blank(),
        #axis.title = element_blank(),
        #axis.ticks = element_blank(),
        # legend.title = element_blank(),
        legend.position = "right")



waffle 包绘制

当然如果前面代码看的非常吃力的话, 这里有一个好用的包,专为华夫饼图做准备的——waffle 包[3]

该包涵盖了以下一些函数:

其中,waffle() 的参数包括:

waffle(parts, rows = 10, keep = TRUE, xlab = NULL, title = NULL, colors = NA, size = 2, flip = FALSE, reverse = FALSE, equal = TRUE, pad = 0, use_glyph = FALSE, glyph_size = 12, legend_pos = "right")

主要参数含义:

  • parts 用于图表的值的命名向量
  • rows 块的行数
  • keep 保持因子水平(例如,在华夫饼图中获得一致的图例)

该部分内容较多,感兴趣的读者可以自行研究这个包。下面给出一些来自该包的简单示例。

简单例子

官方给出了其他案例,使用 geom_pictogram() 配合 scale_label_pictogram() 可以将图形转化为卡通图案等。

data.frame(
  parts = factor(rep(month.abb[1:3], 3), levels=month.abb[1:3]),
  vals = c(10, 20, 30, 6, 14, 40, 30, 20, 10),
  col = rep(c("blue", "black", "red"), 3),
  fct = c(rep("Thing 1", 3),
          rep("Thing 2", 3),
          rep("Thing 3", 3))
) -> xdf



xdf 数据集预览

xdf %>%
  count(parts, wt = vals) %>%
  ggplot(aes(label = parts, values = n)) +
  geom_pictogram(n_rows = 10, aes(colour = parts), flip = TRUE, make_proportional = TRUE) +
  scale_color_manual(
    name = NULL,
    values = c("#a40000", "#c68958", "#ae6056"),
    labels = c("Fruit", "Sammich", "Pizza")
  ) +
  scale_label_pictogram(
    name = NULL,
    values = c("apple-alt", "bread-slice", "pizza-slice"),
    labels = c("Fruit", "Sammich", "Pizza")
  ) +
  coord_equal() +
  theme_ipsum_rc(grid="") +
  theme_enhance_waffle() +
  theme(legend.key.height = unit(2.25, "line")) +
  theme(legend.text = element_text(size = 10, hjust = 0, vjust = 0.75))



xdf %>%
  count(parts, wt = vals) %>%
  ggplot(aes(label = parts, values = n)) +
  geom_pictogram(
    n_rows = 20, size = 6, aes(colour = parts), flip = TRUE,
    family = "FontAwesome5Brands-Regular"
  ) +
  scale_color_manual(
    name = NULL,
    values = c("#073f9c", "black", "#f34323"),
    labels = c("BitBucket", "GitHub", "Other")
  ) +
  scale_label_pictogram(
    name = NULL,
    values = c("bitbucket", "github", "git-alt"),
    labels = c("BitBucket", "GitHub", "Other")
  ) +
  coord_equal() +
  theme_ipsum_rc(grid="") +
  theme_enhance_waffle() +
  theme(legend.text = element_text(hjust = 0, vjust = 1))


此外,利用 geom_waffle()facet_wrap(),还可以将华夫饼图与分面相结合。

library(dplyr)
library(waffle)
storms %>% 
  filter(year >= 2010) %>% 
  count(year, status) -> storms_df
ggplot(storms_df, aes(fill = status, values = n)) +
  geom_waffle(color = "white", size = .25, n_rows = 10, flip = TRUE) +
  facet_wrap(~year, nrow = 1, strip.position = "bottom") +
  scale_x_discrete() + 
  scale_y_continuous(labels = function(x) x * 10, # make this multiplyer the same as n_rows
                     expand = c(0,0)) +
  ggthemes::scale_fill_tableau(name=NULL) +
  coord_equal() +
  labs(
    title = "Faceted Waffle Bar Chart",
    subtitle = "{dplyr} storms data",
    x = "Year",
    y = "Count"
  ) +
  theme_minimal(base_family = "Roboto Condensed") +
  theme(panel.grid = element_blank(), axis.ticks.y = element_line()) +
  guides(fill = guide_legend(reverse = TRUE))


本片主要参考《R 数据可视化之美》第 7 章局部整体型图表,配套代码可见张杰的Github[4]以及waffle 包介绍[5]

参考资料

[1]

1: https://www.rdocumentation.org/packages/ggplot2/versions/0.9.1/topics/geom_tile

[2]

2: https://www.rdocumentation.org/packages/ggforce/versions/0.4.1/topics/geom_circle

[3]

waffle 包: https://github.com/hrbrmstr/waffle

[4]

github: https://github.com/Easy-Shu/Beautiful-Visualization-with-R

[5]

waffle包介绍: https://www.rdocumentation.org/packages/waffle/versions/0.7.0/topics/waffle

目录
相关文章
|
6月前
|
数据可视化 Python
堆叠柱状图(pyecharts足矣 既好看又简单
堆叠柱状图(pyecharts足矣 既好看又简单
423 0
|
6月前
如何将Excel两列数据转换为统计图、曲线图、折线图?如何自定义某一列作为Excel的统计图横纵坐标?
如何将Excel两列数据转换为统计图、曲线图、折线图?如何自定义某一列作为Excel的统计图横纵坐标?
|
6月前
【统计图】Echarts实现多条折线图渐变堆叠效果
【统计图】Echarts实现多条折线图渐变堆叠效果
|
6月前
【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程(上)
【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程
522 0
|
6月前
【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程(下)
【SPSS】基础图形的绘制(条形图、折线图、饼图、箱图)详细操作过程
424 0
|
6月前
|
数据可视化
R可视乎|三维散点图
R可视乎|三维散点图
101 0
|
前端开发
【前端统计图】echarts多条折线图和横柱状图实现
【前端统计图】echarts多条折线图和横柱状图实现
109 0
|
数据采集 数据可视化 数据挖掘
还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
本文讲解9种『炫酷高级』的数据图表,可视化地表示比例或百分比:哑铃图、甜甜圈图、华夫饼图、堆积条形图...附上代码,快快用起来吧!
858 2
还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
pyecharts第九节、旭日图(现代饼图)
pyecharts第九节、旭日图(现代饼图)
405 0
pyecharts第九节、旭日图(现代饼图)
R 可视乎 | 华夫饼图
华夫饼图(waffle chart)分为块状华夫饼图和点状华夫饼图。华夫饼图是展示总数据的组类别情况的一种有效图表。它是西方的一种 由小方格组成的面包,所以这种图表因此得名为华夫饼图。
208 0
R 可视乎 | 华夫饼图