[数据分析与可视化] 数据绘图要点4-饼图的问题

数据绘图要点4-饼图的问题

本文让我们了解有史以来被批评最多的图表类型:饼图。

坏的定义

饼图是一个圆,分为多个部分,每个部分代表整体的一部分。它通常用于显示百分比,其中扇区的总和等于100%。问题是人类在阅读角度方面非常糟糕。在相邻的饼图中,尝试找出最大的一组,并尝试按值对它们进行排序。您可能很难这样做,这就是必须避免使用饼图的原因。让我们尝试比较3个饼图。尝试了解在这3个图形中哪个组的值最高。此外,尝试弄清楚群体之间的价值演变是什么。

# Libraries
library(tidyverse)
library(hrbrthemes)
library(viridis)
library(patchwork)

# create 3 data frame 创建数据
data1 <- data.frame( name=letters[1:5], value=c(17,18,20,22,24) )
data2 <- data.frame( name=letters[1:5], value=c(20,18,21,20,20) )
data3 <- data.frame( name=letters[1:5], value=c(24,23,21,19,18) )
# 查看数据
data1
data2
data3
A data.frame: 5 × 2
namevalue
<fct><dbl>
a17
b18
c20
d22
e24
A data.frame: 5 × 2
namevalue
<fct><dbl>
a20
b18
c21
d20
e20
A data.frame: 5 × 2
namevalue
<fct><dbl>
a24
b23
c21
d19
e18
# 定义绘图函数
plot_pie <- function(data, vec){

ggplot(data, aes(x="name", y=value, fill=name)) +
  # 饼图要先绘制条形图
  geom_bar(width = 1, stat = "identity") +
  # 改为极坐标系
  coord_polar("y", start=0, direction = -1) +
  # 设置填充颜色
  scale_fill_viridis(discrete = TRUE,  direction=-1) + 
  # 显示文字  
  geom_text(aes(y = vec, label = rev(name), size=4, color=c( "white", rep("black", 4)))) +
  scale_color_manual(values=c("black", "white")) +
  theme(
    legend.position="none",
    plot.title = element_text(size=14),
    panel.grid = element_blank(),
    axis.text = element_blank()
  ) +
  xlab("") +
  ylab("")
}

a <- plot_pie(data1, c(10,35,55,75,93))
b <- plot_pie(data2, c(10,35,53,75,93))
c <- plot_pie(data3, c(10,29,50,75,93))
a + b + c

png

现在,让我们使用条形图barplot表示完全相同的数据:

# 定义绘图函数
plot_bar  <- function(data){

ggplot(data, aes(x=name, y=value, fill=name)) +
  # 绘制条形图
  geom_bar(stat = "identity") +
  # 设置填充颜色
  scale_fill_viridis(discrete = TRUE,  direction=-1) + 
  scale_color_manual(values=c("black", "white")) +
  theme(
    legend.position="none",
    plot.title = element_text(size=14),
    panel.grid = element_blank(),
  ) +
  ylim(0,25) +
  xlab("") +
  ylab("")

}

a <- plot_bar (data1)
b <- plot_bar (data2)
c <- plot_bar (data3)
a + b + c

png

让我们谈谈使用图表的原因。

  • 图表是获取信息并使其更易于理解的一种方式。
  • 一般来说,图表的目的是更容易比较不同的数据集。
  • 图表能够在不增加复杂性的情况下传达越多越好的信息。

正如您通过对比图片可以看到,饼图难以直观表现数据间的差异,而条形图正好相反,可以清晰看到不同数据的差别。饼图没法比较各种不同的值,而且也没法传达更多的信息。

解决方案

条形图,柱状图是饼图的最佳替代品。如果你有很多值要显示,你也可以考虑一个在我看来更优雅一点的棒棒糖图。以下是基于世界上少数国家/地区销售的重要物品数量的展示示例:

# 从github加载数据
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/7_OneCatOneNum.csv", header=TRUE, sep=",")
# 清除空值数据
data <- filter(data,!is.na(Value))
nrow(data)
head(data)
# 排列数据
data<- arrange(data,Value)
# 将Contry转换为factor项,来表示分类数据
data<- mutate(data,Country=factor(Country, Country))
# 绘图
ggplot(data,aes(x=Country, y=Value) ) +
# 定义数据轴
geom_segment( aes(x=Country ,xend=Country, y=0, yend=Value), color="grey") +
# 绘制点
geom_point(size=3, color="#69b3a2") +
# x,y轴调换
coord_flip() +
# 设置主题
theme(
    # 将内部线条设置为空
    panel.grid.minor.y = element_blank(),
    panel.grid.major.y = element_blank(),
    legend.position="none"
) +
# 原来x轴也就是现在图像中y轴的轴标题设置为空
xlab("")

38

A data.frame: 6 × 2
CountryValue
<fct><int>
1United States 12394
2Russia 6148
3Germany (FRG) 1653
4France 2162
5United Kingdom 1214
6China 1131

png

如果您的目标是描述整体的组成,另一种可能性是创建树状图。

# Package
# 导入专门的包
library(treemap)

# Plot 绘图
treemap(data,    
        # data
        index="Country",
        vSize="Value",
        type="index",

        # 设置颜色
        title="",
        palette="Dark2",

        # Border 边界框设置
        border.col=c("black"),
        # 边界框线宽
        border.lwds=3,                         

        # Labels 设置标签颜色
        fontcolor.labels="white",
        # 设置字体
        fontface.labels=2,
        # 设置标签位置
        align.labels=c("left", "top"),
        # 设置面积越大,标签越大
        inflate.labels=T,
        # 设置显示标签等级,越小显示的标签越少
        fontsize.labels=5
)

png

参考

posted @ 2021-12-01 12:49  落痕的寒假  阅读(82)  评论(0编辑  收藏  举报