本期内容为 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