Data to Viz:饼图的问题

2023-11-27 18:41:13 浏览数 (2)

本期内容为 THE ISSUE WITH PIE CHART 饼图的问题[2]

1Bad by definition 坏的定义

饼图是一个分为多个扇区的圆,每个扇区代表整体的一部分。它通常用于显示百分比,其中扇区之和等于 100%。

代码语言:javascript复制
# 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) )

# Plot
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_ipsum()  
  theme(
    legend.position="none",
    plot.title = element_text(size=14),
    panel.grid = element_blank(),
    axis.text = element_blank(),
    legend.margin=unit(0, "null")
  )  
  xlab("")  
  ylab("")
  
}

plot_pie(data1, c(10,35,55,75,93))

问题是有的情况下的饼图的阅读体验非常糟糕。如上图,在相邻部分中,尝试找出最大的一组,并尝试按值对它们进行排序。您可能会很难做到这一点,这就是必须避免使用饼图的原因。

如果您仍然不相信,让我们尝试比较下列几个饼图。再次尝试了解这 3 个图形中哪一组的值最高。另外,尝试弄清楚各组之间数值的变化是什么。

代码语言:javascript复制
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

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

代码语言:javascript复制
# A function to make barplots
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_ipsum()  
    theme(
      legend.position="none",
      plot.title = element_text(size=14),
      panel.grid = element_blank(),
    )  
    ylim(0,25)  
    xlab("")  
    ylab("")
}

# Make 3 barplots
a <- plot_bar(data1)
b <- plot_bar(data2)
c <- plot_bar(data3)

# Put them together with patchwork
a   b   c

正如您在此条形图上所看到的,三个饼图之间存在很大差异,并且具有隐藏变化模式,您在讲述故事时绝对不想错过。

2And often made even worse 而且常常变得更糟

即使饼图从定义上来说很糟糕,但通过添加其他不好的功能仍然有可能使它们变得更糟:

  • 3d
  • 图例放在一边
  • 总和≠100%
  • 过多的内容
  • 爆炸饼图(exploded pie charts)

exploded pie charts

3Alternatives 备选方案

条形图是饼图的最佳替代品。如果你有很多值要显示,你也可以考虑棒棒糖图(lollipop plot),我认为它更优雅一些。以下是基于世界上几个国家销售的武器数量的示例:

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

4Going further 更进一步

  • 谁出售更多武器[3]:请参阅这个故事,它提供了饼图的几种替代方案。
  • R[4]Python[5] 中绘制饼图。

私货时间:我认为,如果你还没有明确自己的目的(你到底想要表达给读者什么内容)时,就不要选择饼图。

下图是我汇报时制作的饼图,目的是体现从种植面积的角度体现玉米研究的重要性,提供给大家参考。


关于 DATA TO VIZ

From Data to Viz 系列根据输入数据格式对图表类型进行分类。它以决策树的形式出现,结果是选择一组可能合适的可视化来表示数据集。

该项目建立在两个基本理念之上。首先,大多数数据分析可以概括为大约二十种不同的数据集格式。其次,数据和上下文共同决定合适的图表。

因此,我们建议的方法包括识别并尝试所有可行的图表类型,以找出最适合您的数据和想法的方法。

一旦确定了这组图形,data to viz 就会指导您做出最佳决策。它还提供了要避免的常见注意事项列表,并始终提供 R 编程语言中的可重现代码片段。

Dataviz 是一个充满无限可能性的世界,该项目并不声称详尽无遗。但是,它应该为您提供一个良好的起点。

从数据到可视化目前处于测试版本,强烈鼓励任何反馈。您可以在Github[6]上提出问题,在 Twitter 上留言,或者通过 yan.holtz.data@gmail.com 向作者发送电子邮件。

参考资料

[1]

DATA TO VIZ: https://www.data-to-viz.com/caveat/pie.html

[2]

THE ISSUE WITH PIE CHART 饼图的问题: https://www.data-to-viz.com/caveat/pie.html

[3]

谁出售更多武器: https://www.data-to-viz.com/story/OneNumOneCat.html

[4]

在 R 中绘制饼图: https://r-graph-gallery.com/pie-plot

[5]

在 Python 中绘制饼图: https://python-graph-gallery.com/pie-plot/

[6]

data_to_viz Github: https://github.com/holtzy/data_to_viz

0 人点赞